소스 코드

def dfs(idx,dir):

    # 방문 확인
    check[idx] = 1

    # 시계방향으로 움직이면
    if dir == 1:

        # 톱니 바퀴 이동
        wheel[idx].insert(0,wheel[idx].pop(-1))

        # 0~3번 톱니이고, 방문한 적 없으면
        if 0 <= idx + 1 < 4 and check[idx+1] == 0:

            # 현재 톱니의 3번(이동 전 2번)과 오른쪽 톱니의 6번 확인
            if wheel[idx][3] != wheel[idx+1][6]:
                dfs(idx+1, -1)

        if 0 <= idx - 1 < 4 and check[idx-1] == 0:

            # 현재 톱니의 7번(이동 전 6번)과 왼쪽 톱니의 2번 확인
            if wheel[idx][7] != wheel[idx-1][2]:
                dfs(idx-1, -1)

    else:
        wheel[idx].append(wheel[idx].pop(0))
        if 0 <= idx + 1 < 4 and check[idx + 1] == 0:

            if wheel[idx][1] != wheel[idx + 1][6]:
                dfs(idx + 1, 1)

        if 0 <= idx - 1 < 4 and check[idx-1] == 0:

            if wheel[idx][5] != wheel[idx - 1][2]:
                dfs(idx - 1, 1)

    return

T = int(input())

for tc in range(1,1+T):

    # 회전 수
    k = int(input())

    # 톱니
    wheel = [list(map(int,input().split())) for _ in range(4)]

    # 번호, 방향
    arr = [list(map(int,input().split())) for _ in range(k)]

    for q in arr:

        # 방문 확인용
        check = [0 for _ in range(4)]

        # 번호(1~4번인데 wheel의 index는 0~3이라 -1함), 방향
        dfs(q[0]-1,q[1])

    # 결과
    res = 0

    # 화살표가 가리키는 곳을 계산에 따라 계산
    for w in range(4):
        res += wheel[w][0] * (2**w)

    print('#{} {}'.format(tc,res))

 


해결 방법

- 화살표가 가리키는 톱니의 위치는 0번

 

- 톱니의 2번과 6번이 맞닿아 있다(다른 번호 확인할 필요 없음)

 

해당 문제에서 해결해야할 내용은

 

1. 톱니의 이동의 시작 위치가 정해지지 않았다(1번부터 시작하면 오른쪽만 쭉 확인하면 되고, 3번에서 시작하면 2번과 4번 모두 확인해야 함)

 

2. 톱니는 동시에 값이 변한다(n번째 톱니가 움직이고 난 후에 인접한 톱니와의 관계를 확인하면 안 된다)

 

위의 2 가지라 생각했다

 

1번의 경우, 어디에서 시작하든 왼쪽과 오른쪽을 모두 확인하는 방법을 사용

 

2번의 경우,

 

1) wheel과 temp_wheel을 만들어서 하나의 루틴 안에서 temp_wheel은 값을 변화시키고, 루틴이 끝난 후 wheel의 값을 변경시키는 방법

 

2) wheel의 값을 직접 변화시키고, 이 전값(시계방향으로 움직이면 2 대신 3, 6 대신 7, 시계 반대방향으로 움직이면 2 대신 1, 6 대신 5)을 기준으로 인접한 값과 비교하는 방법

 

두 가지를 떠올렸고 2)번의 방법을 사용하여 문제 해결


느낀 점

 

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.