15685: 드래곤 커브

ewillwin·2023년 7월 6일
0

Problem Solving (BOJ)

목록 보기
109/230

  • 처음에는 모든 드래곤들을 순회하면서, 드래곤의 처음 위치와 방향을 기준으로 세대만큼 시계 방향으로 90도 회전해서 board에 표시를 해주는 방식으로 구현하려 했으나 구현 방법이 막막해서 실패함

  • 구글링을 해본 결과 드래곤 커브의 규칙이 존재함을 확인함
    만약 처음 시작 방향이 0이라면,
    -> 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
    의 방향을 갖음

    (curve[-j-1] + 1) % 4

  • 위의 형식으로 드래곤 마다 curve (드래곤의 방향을 담은 list)를 구할 수가 있음
    -> 해당 list를 통해 board에 드래곤의 위치를 표시

  • 모든 드래곤을 board에 표시한 후, 2중 for문을 돌면서 정사각형의 개수를 구함

import sys

dx = [1, 0, -1, 0]
dy = [0, -1, 0, 1]

N = int(input())
board = [[0] * 101 for _ in range(101)]

for _ in range(N):
    x, y, d, g = map(int, sys.stdin.readline()[:-1].split())

    board[x][y] = 1
    curve = [d] #드래곤커브의 방향 저장
    for i in range(g):
        tmp = []
        for j in range(len(curve)):
            tmp.append((curve[-j-1] + 1) % 4)
        curve.extend(tmp)

    for c in curve: #board에 드래곤의 위치 표시
        nx = x + dx[c]; ny = y + dy[c]
        board[nx][ny] = 1
        x, y = nx, ny
    
#정사각형 개수 구하기
result = 0
for i in range(100):
    for j in range(100):
        if board[i][j] and board[i+1][j] and board[i][j+1] and board[i+1][j+1]:
            result += 1
print(result)
profile
Software Engineer @ LG Electronics

0개의 댓글