Developing Myself Everyday
article thumbnail
Published 2023. 5. 23. 11:39
15685: 드래곤 커브 - Kotlin 백준/구현
 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net

문제

드래곤 커브는 다음과 같은 세 가지 속성으로 이루어져 있으며, 이차원 좌표 평면 위에서 정의된다. 좌표 평면의 x축은 → 방향, y축은 ↓ 방향이다.

  1. 시작 점
  2. 시작 방향
  3. 세대

0세대 드래곤 커브는 아래 그림과 같은 길이가 1인 선분이다. 아래 그림은 (0, 0)에서 시작하고, 시작 방향은 오른쪽인 0세대 드래곤 커브이다.

1세대 드래곤 커브는 0세대 드래곤 커브를 끝 점을 기준으로 시계 방향으로 90도 회전시킨 다음 0세대 드래곤 커브의 끝 점에 붙인 것이다. 끝 점이란 시작 점에서 선분을 타고 이동했을 때, 가장 먼 거리에 있는 점을 의미한다.

2세대 드래곤 커브도 1세대를 만든 방법을 이용해서 만들 수 있다. (파란색 선분은 새로 추가된 선분을 나타낸다)

3세대 드래곤 커브도 2세대 드래곤 커브를 이용해 만들 수 있다. 아래 그림은 3세대 드래곤 커브이다.

즉, K(K > 1)세대 드래곤 커브는 K-1세대 드래곤 커브를 끝 점을 기준으로 90도 시계 방향 회전 시킨 다음, 그것을 끝 점에 붙인 것이다.

크기가 100×100인 격자 위에 드래곤 커브가 N개 있다. 이때, 크기가 1×1인 정사각형의 네 꼭짓점이 모두 드래곤 커브의 일부인 정사각형의 개수를 구하는 프로그램을 작성하시오. 격자의 좌표는 (x, y)로 나타내며, 0 ≤ x ≤ 100, 0 ≤ y ≤ 100만 유효한 좌표이다.

입력

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대이다. (0 ≤ x, y ≤ 100, 0 ≤ d ≤ 3, 0 ≤ g ≤ 10)

입력으로 주어지는 드래곤 커브는 격자 밖으로 벗어나지 않는다. 드래곤 커브는 서로 겹칠 수 있다.

방향은 0, 1, 2, 3 중 하나이고, 다음을 의미한다.

  • 0: x좌표가 증가하는 방향 (→)
  • 1: y좌표가 감소하는 방향 (↑)
  • 2: x좌표가 감소하는 방향 (←)
  • 3: y좌표가 증가하는 방향 (↓)

출력

첫째 줄에 크기가 1×1인 정사각형의 네 꼭짓점이 모두 드래곤 커브의 일부인 것의 개수를 출력한다.

 

 

나의 풀이

 이 문제는 주어진 대로 쭉 진행하면 되는 구현 문제이다. 드래곤 커브가 진행되는 규칙만 찾게 되면 작성은 어렵지 않다.

 나는 이 문제는 4가지의 단계를 거쳐서 진행된다고 생각을 하였다. 

  1. 드래곤 커브의 방향 찾기
  2. 드래콘 커브 진행시키기
  3. 드래콘 커브의 개수만큼 1, 2를 반복하기
  4. 정사각형의 개수를 구하기

 그럼 드래콘 커브가 어떻게 진행되는지 이제 고려를 해야한다. 문제에 힌트가 있다. 드래콘 커브의 방향은 0, 1, 2, 3 중 하나이고 순서가 정해져있다. 이를 dx,와 dy로 정의하면 다음과 같다

 

val dx = arrayOf(0, -1, 0, 1)
val dy = arrayOf(1, 0, -1, 0)

 

 

 이제 문제에 예시로주어진 대로 작대기를 그어서 규칙을 찾아야 한다. 작대기를 다음과 같이 그어보겠다.

 

  위의 방향을 숫자로도 표시해 보겠다.

 

0 1

0 1 2 1

0 1 2 1 2 3 2 1

  이제 규칙을 찾을 수 있다. 위의 숫자들은 중심을 기준으로 대칭되며 오른쪽 대칭의 숫자들에 1을 더하면 드래곤 커브를 구할 수 있다. (다만 3이 넘으면 0으로 돌아가야 한다)

 

그럼 이제 해당하는 방향으로 드래곤 커브를 체크하고 사각형을 구하면 된다. 코드는 아래와 같다

 

val dx = arrayOf(0, -1, 0, 1)
val dy = arrayOf(1, 0, -1, 0)

fun main() = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()
    val dragon = Array(n) { readLine().split(" ").map { it.toInt() }.toIntArray() }

    val visited = Array(101) { BooleanArray(101) }

    for (i in dragon.indices) {
        val (y, x, d, g) = dragon[i]

        val curve = mutableListOf<Int>()
        curve.add(d)
        visited[x][y] = true

        // 드래곤 커브를 파악
        repeat(g) {
            for (j in curve.size - 1 downTo 0) {
                var temp = curve[j]
                if (temp == 3)
                    temp = 0
                else
                    temp += 1

                curve.add(temp)
            }
        }

        // 드래곤 커브를 만들기
        var tempX = x
        var tempY = y
        curve.forEach {
            tempX += dx[it]
            tempY += dy[it]
            visited[tempX][tempY] = true
        }

    }

    var result = 0

    for (i in 0 until 100) {
        for (j in 0 until 100) {
            if (visited[i][j] && visited[i][j + 1] &&
                visited[i + 1][j] && visited[i + 1][j + 1])
                result++
        }
    }
    println(result)
}

'백준 > 구현' 카테고리의 다른 글

14719번: 빗물 - Kotlin  (0) 2023.07.23
17144번: 미세먼지 안녕! - Kotlin  (1) 2023.06.09
14890번: 경사로 - Kotlin  (0) 2023.03.29
14503번: 로봇 청소기 - Kotlin  (0) 2023.02.24
16235번: 나무 재테크 - Kotlin  (0) 2023.02.10
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!