티스토리 뷰
https://www.acmicpc.net/problem/14891
1. 풀이
- 회전하는 톱니바퀴의 왼쪽과 오른쪽을 나눠 각 톱니바퀴의 회전 여부를 파악하자
만약 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
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준] 14499번 주사위 굴리기 파이썬 풀이 (0) | 2024.03.23 |
---|---|
[백준] 5582번 공통 부분 문자열 파이썬 풀이 (0) | 2024.03.21 |
[백준] 12904번 A와 B 파이썬 풀이 (0) | 2024.03.21 |
[백준] 9251번 LCS 파이썬 풀이 (0) | 2024.03.20 |
[백준] 16234번 인구 이동 파이썬 풀이 (0) | 2024.03.19 |