본문 바로가기

알고리즘/삼성 기출

톱니바퀴 [백준 14891번]

문제

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

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

내 풀이

 

dir에 돌려야 할 방향을 저장하고, 나중에 한꺼번에 톱니를 돌리는 것이 핵심이다.

1은 시계방향, -1은 반시계 방향, 0은 부동이다.

 

회전시킨 톱니바퀴를 기준으로 왼쪽을 검사하고, 오른쪽을 검사하면 된다.

 

wheels = [input() for _ in range(4)]
K = int(input())

def clock(wheel):
    return wheel[-1] + wheel[:-1]
def counter_clock(wheel):
    return wheel[1:] + wheel[0]

def move(wheels, idx, d):
    dir = [0]*4
    dir[idx] = d
    # left
    for i in range(idx-1, -1, -1):
        if dir[i+1] and wheels[i+1][-2] != wheels[i][2]:
            dir[i] = dir[i+1] * -1
    # right
    for i in range(idx+1, 4):
        if dir[i-1] and wheels[i-1][2] != wheels[i][-2]:
            dir[i] = dir[i-1] * -1
    for i in range(4):
        if dir[i] == 1:
            wheels[i] = clock(wheels[i])
        elif dir[i] == -1:
            wheels[i] = counter_clock(wheels[i])

for _ in range(K):
    idx, d = map(int, input().strip().split())
    idx -= 1
    move(wheels, idx, d)

ans = 0
for i in range(4):
    if wheels[i][0] == '1':
        ans += 2**i
print(ans)

 

총평

머리 개조..?

'알고리즘 > 삼성 기출' 카테고리의 다른 글

상어 중학교 [백준 21609번]  (0) 2022.10.11
게리맨더링 2 [백준 17779번]  (0) 2022.10.10
아기 상어 [백준 16236번]  (1) 2022.10.08
나무 재테크 [백준 16235번]  (1) 2022.10.08
경사로 [백준 14890번]  (1) 2022.10.08