코딩테스트/백준 코틀린

[6개월 안에 백준 플래티넘 달성하기] 2. 기초 문제에서 사용한 코틀린 메서드 정리

junjunjun 2023. 10. 8. 15:02
반응형

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에 의존해서 진행해야 될 거 같습니다.

반응형