[6개월 안에 백준 플래티넘 달성하기] 2. 기초 문제에서 사용한 코틀린 메서드 정리
2023. 10. 1 ~ 2023. 10. 6 백준 솔브 CLASS1 문제 풀이 완료
CLASS1 문제는 대부분 기초 문법을 활용하기 때문에 어려움 없이 풀 수 있었습니다. 그럼에도 다소 시간이 걸렸던 이유는 기본적인 문법을 사용해서 푸는 방법 이외에 코틀린에서 제공하는 메서드를 활용하는 방법을 찾아보았기 때문입니다.
코틀린에서는 웬만한 기능이 내장 메서드로 제공되기 때문에 JAVA에 비해 쉽게 문제를 풀 수 있었습니다.
(난이도 : 파이썬 < 코틀린 < 자바)
아래는 CLASS1 문제를 풀면서 알게 된 메서드입니다.
입출력
백준의 경우 입력문을 매번 코드로 직접 받아야 하기 때문에 번거로움이 있습니다.
코틀린은 자바 기반의 언어이기 때문에 Scanner와 BufferedReader를 둘 다 쓸 수 있습니다. 하지만 더 간단한 readln(), readLine() 메서드를 제공합니다.
import java.util.*
// Scanner
fun main() {
var input = Scanner(System.`in`)
print(input.nextInt())
print(input.nextLine())
}
// bufferedReader
fun main() {
var input = System.`in`.bufferedReader()
val name = input.readLine()
val age = input.readLine().toInt()
println("name: $name, age: $age")
}
// readln()
fun main() {
val age = readln().toInt() // null을 허용하지 않는다.
val age = readLine()!!.toInt() // null을 허용한다.
}
readLine()은 null을 허용해서 반환형이 String?이고 readln은 null을 허용하지 않아서 반환형이 String입니다.
코테에서는 주로 readln()을 사용합니다.
참고로 Scanner와 bufferedReader 같은 경우 with 메서드를 이용하면 매번 input참조를 하지 않아도 됩니다.
fun main() = with(Scanner(System.`in`)) {
val name = nextLine()
val age = nextInt()
println("name: $name, age: $age")
}
fun main() = with(System.`in`.bufferedReader()) {
val name = readLine()
val age = readLine().toInt()
println("name: $name, age: $age")
}
참고로 with의 문법은 with(객체) {객체 안에 메서드를 객체참조 없이 바로 사용가능}입니다.
출력은 print(), println()을 사용하면 됩니다. System.out.print()
다음은 코테에서 많이 나오는 연속된 숫자를 리스트에 넣는 코드 예시입니다.
입력문 : "1 2 3 4 5"
fun main() {
val list = readln().split(" ").map { it.toInt() }
}
리스트 출력
List를 바로 print로 출력할 경우 [1,2,3] 이런 식으로 대문자까지 나오게 됩니다. 하지만 백준에서 요구하는 출력문은 1 2 3 인 경우가 대부분입니다.
코틀린에서는 list.joinToString(" ") 메서드를 써주면 쉽게 해당 형태로 출력할 수 있습니다.
형 변환
코틀린의 형변환 메서드는 모두 to로 시작하기 때문에 쉽게 변환할 수 있습니다.
fun main() {
val a = "1".toInt()
val b = 3.toString()
}
하지만 Char 형에서 Int형으로 변환할 때 주의할 점이 있습니다. 왜냐하면 숫자 그대로 변환해 주는 것이 아닌 아스키코드값으로 변환해 주기 때문입니다.
fun main() {
print('1'.toInt()) // 49가 나옴
}
따라서 Char형에서 Int형으로 변환해 주기 위해서는 아래와 같은 방법을 써주면 됩니다.
fun main() {
println('1'.toString().toInt()) // 1
println('1' - '0') // 1
}
group 메서드
문자열과 리스트에는 groupBy()와 groupingBy() 메서드가 있습니다.
위 메서드를 사용하면 Map 형태로 항목별로 쉽게 나눌 수 있습니다.
fun main() {
// groupBy은 Map<K, List> 형태로 반환
println("abccc".groupBy {it}) // {a=[a], b=[b], c=[c, c, c]}
// groupingBy은 Grouping객체로 반환되며 eachCount() 로 항목별 개수 카운팅 가능
println("abccc".groupingBy {it}.eachCount()) // {a=1, b=1, c=3}
}
그 밖에도 유용한 메서드가 많이 있었습니다. 이를 잘 활용하면 파이썬 못지않게 코딩테스트 문제를 빠르게 풀 수 있을 거 같습니다.
다만 메서드가 다양하고 많아서 아직까지는 IDE에 의존해서 진행해야 될 거 같습니다.