티스토리 뷰

https://www.acmicpc.net/problem/14891

 


1. 풀이

  • 회전하는 톱니바퀴의 왼쪽과 오른쪽을 나눠 각 톱니바퀴의 회전 여부를 파악하자

출처: 백준 https://www.acmicpc.net/problem/14891

 

만약 2번째 바퀴를 회전시킨다면, 그것의 왼쪽에 있는 바퀴들과 오른쪽에 있는 바퀴들을 따로따로 고민해야 한다.

 

왼쪽을 먼저 보자. 2번째 바퀴의 왼쪽 부분, 즉 인덱스 6과 1번째 바퀴의 오른쪽 부분, 인덱스 2를 비교해야 한다. 두 자성이 다르기 때문에 1전째 바퀴는 2번째의 반대 방향으로 회전한다. 그리고 이제 1번째 바퀴의 인덱스 6과 0번째 바퀴의 인덱스 2를 비교해야 하는데, 0번째 바퀴가 없으므로 비교를 종료한다.

 

그럼 이제 오른쪽 방향을 살펴보자. 2번째 바퀴의 인덱스 2와 3번째 바퀴의 인덱스 6을 비교면하면 두 자성이 같음을 알 수 있다. 그럼 3번째 바퀴는 회전하지 않을 테고, 3번째 바퀴가 회전하기 않기 때문에 그 뒤에 있는 바퀴들도 회전하지 않을 것이다. 따라서 비교를 종료한다.

 

즉, 각 바퀴의 자성을 비교하는 반복문을 종료하는 조건은 ① 두 자성이 같을 때 ② 더 이상 왼쪽/오른쪽에 비교할 바퀴가 없을 때. 이렇게 2가지이다.

 

 

 

2. 정답 코드

import sys

input = sys.stdin.readline

LEFT, RIGHT = 6, 2
CLOCKWISE = 1
S = 1

def rotate(sequence, direction):
    return sequence[-1] + sequence[:-1] if direction == CLOCKWISE else sequence[1:] + sequence[0]

def is_same(a, b):
    return a[RIGHT] == b[LEFT]

wheels = [input().strip() for _ in range(4)]
k = int(input())
for _ in range(k):
    wheel, direction = map(int, input().split())
    wheel -= 1

    rotations = [0] * 4
    rotations[wheel] = direction

    cur = wheel
    for pre in range(cur - 1, -1, -1):
        if is_same(wheels[pre], wheels[cur]):
            break
        else:
            rotations[pre] = rotations[cur] * -1
            cur = pre
    
    cur = wheel
    for nxt in range(cur + 1, 4):
        if is_same(wheels[cur], wheels[nxt]):
            break
        else:
            rotations[nxt] = rotations[cur] * -1
            cur = nxt
    
    for i in range(4):
        if rotations[i] == 0:
            continue

        wheels[i] = rotate(wheels[i], rotations[i])

print(sum([2 ** i if int(wheel[0]) == S else 0 for i, wheel in enumerate(wheels)]))
728x90