본문 바로가기

알고리즘(w.KOTLIN)

[BOJ][2563] 색종이

728x90

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

 

2563번: 색종이

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변

www.acmicpc.net

문제 풀이

1. 가로 세로 101 인 크기의 배열을 선언하고 0으로 초기화 한다.(좌표를 1부터 시작하는 것으로 하기 때문에 101로 잡는다.

2. 검은색 색종이의 startX, endX, startY, endY 값을 구한다.

    - startX = 입력의 첫번째 값 - 1

    - endX = startX + 10 - 1

    - startY = 입력의 두번째 값 - 1

    - endY = startY + 10 - 1

3. 2번에서 각 값에서 1을 빼준 이유는 넓이를 구하기 때문에 선으로 되는 좌표들은 제외하기 위해서 1씩 빼준다.

    - 1씩 빼지 않을 경우 첫번째 검은색 색종이의 경우 x : 3~13 로 범위가 지정 됨

    - 1씩 빼지 않을 경우 첫번째 검은색 색종이의 경우 y : 7~17 로 범위가 지정 됨

4. 2, 3번에서 저장한 좌표를 이용하여 1번에서 선언한 101 X 101 의 배열을 탐색하여 값이 0일 경우에는 1로 넣고 result 값을 증가 시킨다. 값이 1일 경우에는 이미 영역으로 되어 있기 때문에 다음 탐색을 진행한다.

 

코드

import java.io.*

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val N = br.readLine().toInt()
    val square = Array(101) { IntArray(101) { 0 } }
    val coor = mutableListOf<Pair<Int, Int>>()
    var result = 0

    repeat(N) {
        val (x, y) = br.readLine().split(" ").map { it.toInt() }
        coor.add(Pair(x, y))
    }

    repeat(N) {
        // 좌표에 저장된 리스트를 탐색하여 squre 에 1로 채운다.
        // 이때 0으로 되어 있을 때에만 1로 채운다.
        coor.forEach { co ->
            val startX = co.first + 1
            val endX = startX + 10 - 1
            val startY = co.second + 1
            val endY = startY + 10 - 1

            for (x in startX..endX) {
                for (y in startY..endY) {
                    if (square[x][y] == 1) continue
                    
                    if (square[x][y] == 0) {
                        square[x][y] = 1
                        result++
                    }
                }
            }
        }
    }

    println(result)
}
728x90