본문 바로가기

Kotlin/Basic

Kotlin 코딩테스트 기초 문법 정리 #1

현직 Android 개발자이기도하고 지향하는 커리어도 Kotlin fullStack이다 보니 Kotlin으로 코테를 준비하는게 맞다는 생각이 들었다.

문제를 풀면서 필요했던 함수 혹은 알면 쓸만한 내용을 기록해두고자 한다.

자료구조 관련 내용은 따로 작성하겠다.

[내용 추가 진행 중입니다.....]


1. 입출력

기본 입출력

readln(), readLine(), print(), println()

fun main() {
    var name = readln() // 입력
    var yourName = readLine() // 입력
    print("my name: $name") // 일반 출력
    println("my name: $name") // 출력 후 개행
}

readln()은 kotlin 1.6부터 도입된 입출력 함수다. 기능은 readLine()과 같은 입력 기능을 수행하지만, null이면 예외를 발생시킨다는 차이가 있다.
백준과 프로그래머스는 Kotlin 버전이 1.6 이상이라 readln()사용이 가능하고, softeer는 1.3대를 사용 중이라 readLine()을 사용해야 한다.

readLine()을 사용할 경우 non-null(!!)처리나 safe-call(?.)이 필요 할 수 있다.
본인은 앞으로의 내용에서 readln()을 주로 사용한다.

입력받기

코딩테스트는 문제에서 입력을 다음과 같이 주고 공백으로 구분하라는 경우가 매우 잦다.

(예시) 
N은 총 갯수.. M은 찾고자 하는 숫자.. 입력은 공백을 사이에 두고 입력..
4 5
...

split()을 사용해 입력 받은 내용을 원하는 기준으로 나눌 수 있다.

fun main() {
    var (N, M) = readln().split(" ") // 공백을 기준으로 나눔
}

위 코드는 입력받은 값이 N과 M에 String 타입으로 저장된다.
만약 Int형으로 저장하고 싶다면, map을 사용해 값의 타입을 변경해 줘야한다.

fun main() {
    var (N, M) = readln().split(" ").map{ it.toInt() } // 각 값을 Int형으로 저장
}

비슷한 방식으로 List 컴프리헨션을 통해 값을 저장할 때, 각 원소의 타입을 통일시킬 수 있다.

val list = readln().split(" ").map{ it.toInt() }
// >> Input: 1 2 3 4 5
// >> Output: [1, 2, 3, 4, 5]

빠른 입출력

java.io의 버퍼 입출력 함수를 사용한다.
BufferedReader, BufferedWriter

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

fun main(){
    val br = BufferedReader(InputStreamReader(System.`in`)) // BufferedReader 객체 생성
    val bw = BufferedWriter(OutputStreamWriter(System.`out`)) // BufferedWriter 객체 생성

    val str = br.readLine() // 한 줄 입력 받기 ✅
    val strLine = br.readLines() // 여러 줄 입력 받기

    bw.write(str) // 한 줄 출력하기 ✅
    bw.newLine() // 줄 바꿈
    bw.write(strLine.joinToString("\n")) // 여러 줄 출력하기
    bw.flush() // 버퍼 비우기 ✅
    bw.close() // BufferedWriter 닫기
}

BufferedReader의 readLine()는 공백을 포함하는 한 줄 전체를 읽어 String 타입으로 반환해준다.
BufferedWriter는 write로 저장한 내용을 flush()로 한번에 출력하기 때문dp I/O 작업이 최소화되어 println() 보다 빠르다.

주석에 ✅를 표시해둔 명령어만 기억해도 문제 없다고 생각된다.


반복문

repeat

문제에서 주어지는 정수 n만큼 반복해야하는 경우, repeat()을 사용하면 편하다.

(예시)
첫째 줄에 주어지는 명령의 수 N...
둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다...

참조: Baekjoon 10828
이런 반복적인 입력이 필요한 경우 repeat를 사용하면 다음과 같다.

fun main(){
    val n = readln().toInt()
    repeat(n){
        val cmd = readln()
        ...
    }
}

뭔가 반복이 필요한 상황에서 간편하게 사용하기 편한 함수라 반드시 알아두는 것을 추천한다.

for문

기본적인 for문에 대한 내용은 모를리가 없는 내용일테니 생략하겠다.

for (i in 1..5) { // 1 ≤ i ≤ 5
    print("$i ") 
}
// output >> 1 2 3 4 5

for (i in 1 until 5) { // 1 ≤ i < 5
    print("$i ") 
}
// output >> 1 2 3 4

val list = arrayListOf(1, 2, 3, 4, 5)
for(i in list){ // 리스트 요소 직접 반환
    print("$i ")
}
// output >> 1 2 3 4 5

val str = "hello world!"
for(i in str.indices){ // 문자열 길이 만큼 반복문 진행
    print(str[i])
}
// output >> hello world!

for문은 위 내용 정도만 알면 왠만한 문제를 푸는데 어려움이 없다고 생각된다.

while문은 어느 언어나 동일하니 넘기겠다.


문자열

Kotlin은 문자열 가공이 참 편한거 같다.

fun main() {
    val str = "Hello world!"

    str.length // 길이 반환 => 12
    str.indices // 범위 반환 => 0 .. 11

    str.uppercase() // 대문자로 변환 => HELLO WORLD!
    str.lowercase() // 소문자로 변환 => hello world!

    str.ifEmpty { "empty" } // 문자열이 비어있으면 "empty" 반환
    str.ifBlank { "blank" } // 문자열이 공백이면 "blank" 반환

    str.substring(startIndex = 1, endIndex =  3) // startIndex 와 endIndex 사이의 String 반환
    str.slice(1 .. 3) // 입력한 범위의 String 반환

    str.find{ char -> char == 'l' } // 조건 식에 맞는 첫번째 문자 반환
    str.filter{ char -> char == 'l' } // 조건 식에 맞는 모든 문자를 합친 문자열 반환

    str.take(3) // 앞의 문자 3개를 가진 문자열 생성 => Hel
    str.drop(3) // 앞의 문자 3개를 버린 문자열 생성 => lo world!

    str.replace(oldChar = 'H', newChar = 'h') // 문자 대치 => hello world!
    str.replace("a[bc]+d?".toRegex(), "") // 정규식 적용
}

당장 문제를 풀면서 사용했던 확장함수를 생각나는데로 정리했다.
이 정도만 알아도 왠만한 문제를 푸는 데는 문제가 없다고 생각된다.
더 많은 내용은 공식문서를 참고바란다.

[내용 추가 진행 중입니다.....]

'Kotlin > Basic' 카테고리의 다른 글

[Kotlin] 반복문  (2) 2024.05.18
집합: Set, MutableSet  (0) 2023.12.03
가변 인자 목록: vararg  (0) 2023.12.03
[Kotlin] object & companion object  (0) 2023.01.19
[Kotlin] lateinit와 lazy의 차이점  (0) 2023.01.17