본문 바로가기
스터디(beakjoon)

Kotlin] 백준 10798번 문제풀이

by 김마리님 2023. 6. 14.

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

 

2563번: 색종이

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록

www.acmicpc.net

 

 

풀이

더보기

(아마 제 풀이가 완벽하지 않을 수 있읍니다)

어차피 색종이 크기는 정해져있기 때문에 미리 2차원 배열로 100 * 100의 배열로 준비해둡니다. 그리고 값을 1로 초기화 해둡니다.

 

종이 갯수를 첫 줄로 받아왔으면 1~종이갯수까지 반복합니다.

첫번째 종이의 가로와 세로의 좌표를 받아옵니다. 3 7이라고 예를 들면, 종이가 가로 10칸 세로 10칸이라고 했으므로

3 4 5 6 7 8 9 10 11 12, 10칸을 먹으므로 가로 반복문의 range 는 (3 until (3 + 10))이 됩니다.

가로 반복문 내에서 세로 반복문을 한번 더 처리해야합니다 (3, 7) (3, 4) ... (3, 16) 후, 다시 옆줄로 넘어가서 (4, 7), (4, 8) ... (4, 16) 이렇게 되기 때문입니다. 세로 반복문의 range도 동일하게 (7 until (7 + 10))이 됩니다.

그리고 가로 반복문의 index와 세로 반복문의 index와 일치하는 전체 종이의 index를 0으로 변경해줍니다. 0 으로 변경된 영역이 종이로 덮인 영역이라 생각합니다. 이렇게 되면 다음 종이가 들어와도 어차피 0이기 때문에 0으로 그대로 유지되게 됩니다. 즉, 겹쳐도 상관 없는거죠.

paper[가로 인덱스][세로 인덱스] = 0

 

종이 전체를 돌면서 변경했다면, 나와서 종이 배열을 반복문으로 돌면서 count { it -> it == 0 } 을 통해 0의 수만 세어주면 됩니다.

 

fun main(args: Array<String>) {
    question2563()
}

fun question2563() {
    var paperCount = readLine()!!.toInt()
    var paper : Array<Array<Int>> = Array(100) { Array(100) { 1 } }
    var count = 0

    for(i in 1 .. paperCount) {
        var item = readLine()!!.split(" ").map { it.toInt() }
        for ( j in item[0] until item[0] + 10) {
            for( k in item[1] until item[1] + 10) {
                    paper[j][k] = 0
            }
        }
    }

    paper.forEach {
        count += it.count { item -> item == 0 }
    }

    println(count)
}
반응형