알고리즘/구현

[백준]15685 드래곤커브 #회전

씩씩한 IT블로그 2020. 6. 17. 21:45
반응형

1. 풀이

행렬에서 한 점을 축으로 하고, 90도로 회전할 때, 이를 식으로 나타낼 수 있다.

축으로 하는 점을 (x,y), 90도로 회전시킬 점을 (a,b), 회전된 점을 (A,B)라고 할 때

(1) 시계방향으로 회전

A=x-y+b

B=x+y-a

(2) 반시계방향으로 회전

A=x+y-b

B=-x+y+a

2. 소스코드

x,y를 각각 행과 열로 바꿔서 생각하면, 시계방향이 아닌 반시계 방향으로 움직여야 하고,

입력값 d도 (x는 행, y는 열로) 다르게 생각해 주어야 한다.

N=int(input())

myMap=[[0 for _ in range(101)] for _ in range(101)]

dR=[1,0,-1,0]
dC=[0,-1,0,1]

for i in range(N):
    r,c,d,g=map(int,input().split())
    curve=[[r,c],[r+dR[d],c+dC[d]]]
    axis=[r+dR[d],c+dC[d]]
    nextAxis=[0,0]
    # 기준에 1찍기
    for a,b in curve:
        myMap[a][b]=1

    # 세대시작
    for gen in range(g):
        # 기준제외 모든점 돌아서 찍힌다
        for j in range(len(curve)):
            # 회전
            newA=axis[0]+axis[1]-curve[j][1]
            newB=-axis[0]+axis[1]+curve[j][0]
            if (j==0):
                nextAxis[0]=newA
                nextAxis[1]=newB
            if not (newA==axis[0] and newB==axis[1]):
                curve.append([newA,newB])
                myMap[newA][newB]=1
        # 기준교체
        axis[0]=nextAxis[0]
        axis[1]=nextAxis[1]

ans=0
for i in range(100):
    for j in range(100):
        if (myMap[i][j] and myMap[i][j+1] and myMap[i+1][j] and myMap[i+1][j+1]):
            ans+=1
print(ans)
반응형