Kotlin Coding Test Tip: Basic

몰름보반장·2024년 3월 12일
post-thumbnail

원래 갓동빈 책이나 여러 강의들 들으면서 주로 Python으로 코딩 테스트를 준비해 왔는데..
아무래도 하는 일이 Android 개발이고 지향하는 커리어 방향도 Kotlin Android 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()을 사용해야 한다. 지금 버전이 1.9인데 1.3대는 쩜;;;
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문에 대한 내용은 이 글을 보는 사람이라면 아는 내용일테니 생략

<, >와 같은 부등호 보다 ..until로 빠르게 범위를 입력해준다.

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!

이정도는 알아두면 쓸만하다.

while문은 어느 언어나 비슷비슷하니 Skip


문자열

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(), "") // 정규식 적용
}

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

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

profile
저도 잘몰라요

0개의 댓글