(Python) 백준 15685번 : 드래곤 커브
알고리즘/[Python] 백준

(Python) 백준 15685번 : 드래곤 커브

 

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

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 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,

www.acmicpc.net


 

(Python) 백준 15685번 드래곤 커브

(Python) 백준 15685번 : 드래곤 커브

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

  • 알고리즘 분류:
    • 시뮬레이션

In [19]:
if __name__ == '__main__':
    N = int(input())
    board = [[0]*101 for _ in range(101)] # 드래곤 커브가 지나간 곳은 1, 아니면 0

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

    for _ in range(N): # 서로 다른 드래곤 커브가 N개 있음
        y, x, d, g = map(int, input().split())
        total_array = [(x, y), (x+dx[d], y+dy[d])]
        board[x][y] = 1
        board[x+dx[d]][y+dy[d]] = 1
        for generation in range(g): # g번의 세대에 걸쳐서 드래곤 커브를 확장한다.
            add_array = [] # 새로 추가될 좌표
            lx, ly = total_array[-1][0], total_array[-1][1] # 기준점
            for px, py in total_array[len(total_array)-2::-1]:
                nx = lx - (ly - py)
                ny = ly + (lx - px)
                ## 맵을 벗어나는가?
                if not(0 <= nx <= 100 and 0 <= ny <= 100): break
                board[nx][ny] = 1 # board 업데이트 (드래곤 커브가 지나가는 곳이다.)
                add_array.append((nx, ny))
            ## 원래 드래곤 커브에다가 새로 생긴 드래곤 커브를 더한다.
            total_array.extend(add_array)
            add_array.clear()
    cnt = 0
    for i in range(100):
        for j in range(100):
            if not(board[i][j]==1): continue
            if not(board[i][j+1]==1): continue
            if not(board[i+1][j]==1): continue
            if board[i+1][j+1]==1: cnt = cnt + 1
    print(cnt)
4
50 50 0 10
50 50 1 10
50 50 2 10
50 50 3 10
1992