본문 바로가기
CS/Coding Test

[백준/11399/Kotlin] ATM

by bona.com 2025. 3. 6.

문제

이번에 푼 문제는 누적된 합의 최솟값을 구하는 문제이다.

각 개인에게 걸린 값의 합이 최소가 되게 하려면 큰 값은 가장 나중에 더해줘야 되기 때문에 오름차순 정렬을 해주고자 했다.

이번에는 내가 놓쳤던 부분에 대해서 정리하고자 한다.

 

트러블 슈팅

1) 띄어쓰기 별로 읽기

처음에 BufferedReader.readLine()은 라인별로 읽는다고 생각해서 나는 띄어쓰기 별로 읽어야 하므로 BufferedReader.read()를 사용했었다. 그러나, read() 함수를 사용하면 한 글자(문자)를 읽어 해당 문자의 ASCII 값을 반환한다고 한다.

 

그래서 readLine().toInt()로 하되, 공백(" ")을 기준으로 분리(split)를 하고, 이를 다시 list로 반환하게 해줬다.

val numberList = bufferedReader.readLine().split(" ").map { it.toInt() }

 

2) Kotlin의 sorted()는 새로운 List를 반환

그렇게 numberList에 입력해준 값들을 저장하고 sorted()를 사용하여 정렬 후, 더해주었더니 값이 엉뚱하게 나왔다.

그래서 우선 numberList를 출력해보니, 오름차순으로 정렬이 되어 있지 않고 내가 입력한 값 그대로 존재함을 확인할 수 있었다.

 

그래서 찾아보니 sorted()는 기존의 리스트를 바꾸지 않고, 새로운 리스트를 반환하고 있었다.

그래서 numberList를 선언할 때 sorted()를 넣도록 수정해 주었다.

val numberList = bufferedReader.readLine().split(" ").map { it.toInt() }.sorted()

 

3) 누적된 값 잘못 계산

그렇게 바뀐 numberList 값을 더해서 result라는 변수에 저장을 했는데 이번에도 생각했던 것보다 값이 적게 나오는듯 했다.

 

그도 그럴 것이, 각 개인의 누적 값을 더해준 게 아니라 마지막 사람의 누적값만 출력했기 때문이었다.

그래서 한 사람의 누적값을 저장할 변수 accTime을 만들어 주고, 또 이 누적값을 전부 저장할 변수 totalTime을 만들어 주었다.

var accTime = 0
var totalTime = 0

for (time in numberList) {
    accTime += time
    totalTime += accTime
}

 

+) 개선 사항

내가 생각하는 개선 사항이 하나 있다. 바로 첫 번째로 입력받은 n을 사용하지 않은 것이다.

내가 입력한 변수가 사용되지 않은 것은 뭔가 효율적으로 작성하지 못한 기분이 들었다. 

전체 코드

fun main() {
    val bufferedReader = BufferedReader(InputStreamReader(System.`in`))
    val bufferedWriter = System.out.bufferedWriter()

    val n = bufferedReader.readLine().toInt()

    val numberList = bufferedReader.readLine().split(" ").map { it.toInt() }.sorted()

    var accTime = 0
    var totalTime = 0

    for (time in numberList) {
        accTime += time
        totalTime += accTime
    }

    bufferedWriter.write(totalTime.toString())

    bufferedReader.close()
    bufferedWriter.close()
}

'CS > Coding Test' 카테고리의 다른 글

[백준/1764/Kotlin] 듣보잡  (0) 2025.03.16
[백준/2751/Kotlin] 수 정렬하기 2  (1) 2025.03.04
[BOJ/1929/C++] 소수 구하기  (0) 2024.02.04
[BOJ/9205/C++] 맥주 마시면서 걸어가기  (1) 2024.02.01
[BOJ/1181/C++] 단어 정렬  (1) 2024.01.26