코딩무비

[백준]14891번 톱니바퀴(python 파이썬)

by 코딩무비
반응형

 

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

생각해보아야 할 것

 

1. 회전은 어떻게 구현하는가?

시계방향으로
회전 했을 때
  • 맨 뒤 빼고 맨 앞에 붙이기
wheels[number].appendleft(wheels[number].pop())
반시계방향으로
회전 했을 때
  • 맨 앞 빼고 맨 뒤에 붙이기
wheels[number].append(wheels[number].popleft())

 

 

2. 해당 톱니바퀴는 회전해야 하는가?

 

K번 톱니바퀴를 돌렸을 때

 
  • K-1번 톱니바퀴부터 0번 톱니바퀴까지 오른쪽 톱니바퀴와 다른 극인지 확인
for i in range(w-1,-1,-1):
        if wheels[i][2] != wheels[i+1][-2]:
            is_rotate[i] =True
        else:
            break
  • K+1번 톱니바퀴부터 4번 톱니바퀴까지 왼쪽 톱니바퀴와 다른 극인지 확인
for i in range(w+1,4):
        if wheels[i][-2] != wheels[i-1][2]:
            is_rotate[i] = True
        else:
            break

 

 

3. 해당 톱니바퀴는 어떻게 회전해야 하는가?

K번 톱니바퀴를 돌렸을 때
  • i번 톱니바퀴와 K번 톱니바퀴가 2의 배수만큼 차이나면 같은 방향
if is_rotate[i] and (w-i)%2 == 0:
            rotate(i,d)
  • i번 톱니바퀴와 K번 톱니바퀴가 2의 배수만큼 차이나지 않으면 다른 방향
elif is_rotate[i] and (w-i)%2 == 1:
            rotate(i,not d)

 

 

 

전체 코드
"""
https://www.acmicpc.net/problem/14891

시계방향이면 -> 맨뒤 떼고 맨 앞에 붙이기 pop(),appendleft() 
반시계방향이면 -> 맨 앞 떼고 맨 뒤에 붙이기 popleft(), append()


"""
def rotate(number,direct):
    if direct:
        wheels[number].appendleft(wheels[number].pop())
    else:
        wheels[number].append(wheels[number].popleft())


def check(w,d): 
    is_rotate = [False for _ in range(4)]
    is_rotate[w] = True
    for i in range(w-1,-1,-1):
        if wheels[i][2] != wheels[i+1][-2]:
            is_rotate[i] =True
        else:
            break
    for i in range(w+1,4):
        if wheels[i][-2] != wheels[i-1][2]:
            is_rotate[i] = True
        else:
            break
    for i in range(4):
        if is_rotate[i] and (w-i)%2 == 0:
            rotate(i,d)
        elif is_rotate[i] and (w-i)%2 == 1:
            rotate(i,not d)

from collections import deque
wheels = []
for _ in range(4):
    wheel = deque(list(input()))
    wheels.append(wheel)

K = int(input())
for _ in range(K):
    a,b = map(int,input().split()) # 휠, 방향
    if b == 1:
        is_right = True
    else:
        is_right = False
    check(a-1,is_right)

result = 0
for i in range(4):
    result+= int(wheels[i][0])*(2**i)

print(result)

 

 

반응형

블로그의 정보

코딩무비

코딩무비

활동하기