개발새발 - IT 기술블로그
article thumbnail

백준 알고리즘 공 넣기 10810 - 코틀린 풀이

 

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

 

10810번: 공 넣기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이

www.acmicpc.net

 


 

문제

 


 

정답

import java.lang.StringBuilder
import java.util.*

fun main() {
    val sc = Scanner(System.`in`)
    val N = sc.nextInt()
    val M = sc.nextInt()
    val arrayN = IntArray(N)
    val result = StringBuilder()

    for(m: Int in 0 until(M)) {
        val i = sc.nextInt()
        val j = sc.nextInt()
        val k = sc.nextInt()

        for (insert: Int in i..j) {
            arrayN[insert - 1] = k
        }
    }

    for (i in arrayN) {
        result.append("$i ")
    }

    println(result)
    sc.close()
}

 

풀이

 

이번 문제는 1차원 배열을 이용해 각 바구니에 마지막으로 들어간 공의 번호를 출력하는 문제입니다.

 

첫번째 줄엔 바구니의 숫자와 input을 반복할 횟수를 입력받습니다.

 

그 다음, 입력받은 횟수만큼 시작index, 끝index, 공 번호에 대한 input을 받고 바구니 배열을 출력하면 됩니다.

 

이 문제 풀이의 핵심은 "만약, 바구니에 공이 이미 들어있는 경우에는 들어있는 공울 빼고 새로 공을 넣는다" 입니다.

 

결국, 중첩이 아닌 갱신의 형태로 값을 넣어주면 되는거죠.

 

 

저는 두 개의 input을 받고 바구니의 개수 크기의 배열을 생성하였으며, 결과를 출력할 StringBuilder를 생성하였습니다.

val N = sc.nextInt()
val M = sc.nextInt()
val arrayN = IntArray(N)
val result = StringBuilder()

 

그 다음 공을 넣는 input을 받기 위해 M의 크기만큼 반복문을 생성하였습니다.

for(m: Int in 0 until(M)) {
    val i = sc.nextInt()
    val j = sc.nextInt()
    val k = sc.nextInt()

    for (insert: Int in i..j) {
        arrayN[insert - 1] = k
    }
}

 

이 때 헷갈릴만한 부분이 생기는데, 바구니는 1번부터 시작하지만 배열의 인덱스는 0번 부터 시작한다는 것이죠.

 

따라서, 반복문의 인덱스와 맞춰주기 위해선 값을 갱신시킬 배열의 인덱스를 1만큼 줄여줘야 한다는 것입니다.

 

 

미리 생성해 놓은 바구니 배열에 입력받은 k(공 번호)를 넣어주고, 아래와 같이 결과값을 만들어줍니다.

for (i in arrayN) {
    result.append("$i ")
}

 

마지막으로 값을 출력하고 예제를 종료해주시면 됩니다.

println(result)

 

 

감사합니다.