[Kotlin]PS_3

Hood·2024년 7월 30일

매일PS

목록 보기
3/11
post-thumbnail

✍   Kotlin을 사용한 백준 알고리즘 문제풀이

매일 백준의 알고리즘 문제를 풀며 3문제씩 풀며
한 언어를 마스터 할 것을 목표로 이 글을 작성할 예정입니다.


🔎 10951번

https://www.acmicpc.net/problem/10951

이번 문제는 풀 때 EOF를 고려해서 입력을 멈추는 방법을 고려해야 겠다고 생각했다.
입력 받는 것이 이제 무한 루프문이기에 끝내기 위해서는 프로그램을 강제 종료해야 했다.
EOF 란?
End Of File의 줄임말로, 파일의 끝을 나타내는 코드이다.
javakotlin 에서는 입력받는 코드가 null일 때 적용된다.

이번 문제에는 풀이를 두 가지로 가져와 봤는데 하나는 자바의 Scanner를 사용하는 방법이고
코틀린의 generateSequence를 이용하는 방법이다.

import java.util.Scanner

fun main() {
    val scanner = Scanner(System.`in`)

    while (scanner.hasNextInt()){
        val a = scanner.nextInt()
        val b = scanner.nextInt()
        println(a+b)
    }
}

자바의 Scanner 는 Scanner 객체를 생성하고 새로운 객체를 heap 메모리에 할당한다.
System.in은 화면에서 입력을 받겠다는 의미로 받아들이면 된다.
while문 안에 조건은 Int형으로 넘어오지 않으면 반복문을 멈추겠다는 의미이다.
nextInt( )는 말 그대로 int형을 읽고 while문에 Int형이 넘어오지 않을때 까지 반복한다.

fun main() {
    val input = generateSequence(::readLine)
    val lines = input.toList()
    for (line in lines){
        val (a, b) = line.split(" ").map {it.toInt()}
        println(a + b)
    }
}

다음 방법은 generateSequence 함수를 이용하는 방법인데
시퀀스 Sequence는 순차적인 컬렉션으로 요소의 크기를 특정하지 않고,
map, filter와 같이 임시로 컬렉션을 만들는 불필요한 컬렉션이 아닌
원소에 연산을 차례대로 적용하다가 결과가 얻어지면
그 이후 원소에 대해서는 연산하지 않는점이 장점이다.

그렇기에 generateSequence 안에 readLine을 넣어 input을 만들어주고
그것을 리스트로 만들겠다는 lines를 만들어
for문으로 lines의 결과 만큼 반복을 돌려주었고
그 과정에서 계산을 처리하여 input안 Sequence안에 저장하는 방식으로 처리했다.
대신 결과가 바로바로 나오지 않고 종료되면 한번에 나온다.


🔎 10952번

https://www.acmicpc.net/problem/10952

이건 위의 문제의 약간 변형인데 a, b가 0 0 이 들어올 때
프로그램이 종료되어야 하기 때문에
조건을 주어 둘 다 0일 때 break를 거는 간단한 문제였다.

fun main() {
    while (true) {
        val (a, b) = readln().split(" ").map { it.toInt() }
        if (a == 0 && b == 0) { break }
        else { println(a+b) }
    }
}

🔎 10807번

https://www.acmicpc.net/problem/10807

이 문제는 Kotlin을 사용하면 굳이 intCount를 세지 않아도
내가 넣은 nums를 생성해 원하는 숫자를 찾는 문제였다.
.count() 함수를 이용하여 wanFindNum 과 같다면 count가 되는 방법이였다.

fun main() {
    val intCount = readln().toInt()
    val nums = readln().split(" ")
    val wantFindNum = readln().toInt()
    println(nums.count { it.toInt() == wantFindNum })
}

📌결론

하는 도중에 런타임에러가 많이 발생했는데
코틀린의 메모리를 다루는 방법과 내부함수에 대한 공부가 많이 필요하겠다고 느꼈다.
또한 자바식을 많이 사용하기에 자바와 좀 친해질 필요가 있다고 생각했다.

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글