드래곤커브 파이썬 백준 15685

-·2022년 4월 11일
0

알고리즘

목록 보기
2/16

문제

input

첫째 줄에 드래곤 커브의 개수 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좌표가 증가하는 방향 (↓)

output

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

TODO

  1. N, 드래곤커브 정보 = input data

  2. 드래곤커브 규칙 찾기

    문제의 예시를 보면
    dir = [(1,0), (0,-1), (-1,0) , (0,1)]에서 우 -> 상 -> 좌 -> 하
    주어진 방향으로 1번 -> 1세대 // dir[d]
    n-1세대까지 전체방향역순으로 전개하는데 방향에 +1씩 -> n세대

  3. 정사각형의 개수 구하기 : 위험에 빠진거 아님

CODE

N = int(input()) 
infor = [list(map(int,input().split())) for _ in range(N)]
dir = [(1,0), (0,-1), (-1,0) , (0,1)]

def curve(dragon,x,y,d,g,dir_list):
    if not dragon : 
        dragon.append((x,y))
        x += dir[d][0]
        y += dir[d][1]
        dir_list[0] = (d+1)%4
        dragon.append((x,y))
        return curve(dragon,x,y,d,g-1,dir_list)
    if g == -1: 
        return dragon 
    else :
        len_dir = len(dir_list)
        for i in range(len_dir-1, -1, -1 ):
            dragon.append((dragon[-1][0] + dir[dir_list[i]][0], dragon[-1][1] + dir[dir_list[i]][1]))
            dir_list.append((dir_list[i]+1)%4)
        return curve(dragon,x,y,d,g-1,dir_list)


if __name__ == "__main__": 
    dragon_curve = [] 
    for info in infor:
        dragon_curve.append(curve([],*info,[info[2]]))

    world = [[0 for _ in range(101)] for _ in range(101)]
    for dr in dragon_curve: 
        for d in dr: 
            world[d[1]][d[0]] = 1
    answer =0 
    for i in range(100): 
        for j in range(100):
            if world[i][j] and world[i][j+1] and world[i+1][j] and world[i+1][j+1] :
                answer +=1
    print(answer)

회고

x,y,d,를 계속 재귀함수로 건내줄 필요없다.
main함수가 너무 지저분하다

profile
-

0개의 댓글

관련 채용 정보