현직 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 |