본문 바로가기

알고리즘/삼성 기출

드래곤 커브 [백준 15685번]

문제

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

 

15685번: 드래곤 커브

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

www.acmicpc.net

 

내 풀이

 

전형적인 규칙 찾기 문제이다.

드래곤 커브가 만들어질 때 방향을 구해보면 규칙을 찾을 수 있다.

 

문제에 나온 예시로 규칙을 찾아보자.

0세대 : 0

1세대 : 0 1

2세대 : 0 1 2 1

3세대 : 0 1 2 1 2 3 2 1

4세대 : 0 1 2 1 2 3 2 1 2 3 0 3 2 3 2 1

 

k세대에 새로 만들어지는 방향은 k-1세대의 방향들을 뒤집은 후 1을 더해주면 된다.

4세대를 예로 들어보겠다.

3세대 뒤집기 -> 1 2 3 2 1 2 1 0 -> 1을 더하기 -> 2 3 0 3 2 3 2 1 -> 3세대에 붙이기 -> 1 2 3 2 1 2 1 0 2 3 0 3 2 3 2 1

 

나는 딕셔너리를 사용하여 k세대의 방향을 저장하였다.

 

x축과 y축을 명명한 것이 평소에 내가 사용하던 방법과 달라서 좀 시간을 끌었다.

 

dx, dy = [1, 0, -1, 0], [0, -1, 0, 1]
N = int(input())
board = [[0]*101 for _ in range(101)]
for _ in range(N):
    x, y, d, g = map(int, input().strip().split())
    dir = {0: [d]}
    for k in range(1, g+1):
        # k세대
        arr = dir[k-1] + [(x+1)%4 for x in dir[k-1]][::-1]
        dir[k] = arr
    board[y][x] = 1
    for i in dir[g]:
        x += dx[i]
        y += dy[i]
        board[y][x] = 1
ans = 0
for i in range(101):
    for j in range(101):
        if i+1 < 101 and j+1 < 101:
            if board[i][j] and board[i+1][j] and board[i][j+1] and board[i+1][j+1]:
                ans += 1
print(ans)

 

총평

규칙을 잘 찾아보자!

'알고리즘 > 삼성 기출' 카테고리의 다른 글

이차원 배열과 연산 [백준 17140번]  (1) 2022.10.06
미세먼지 안녕! [백준 17144번]  (0) 2022.10.06
감시 [백준 15683번]  (0) 2022.10.05
인구 이동 [백준 16234번]  (0) 2022.10.01
치킨 배달 [백준 15686번]  (0) 2022.09.29