본문 바로가기
ALGORITHM/BAEKJOON

[BOJ/Python] 14981. 톱니바퀴

by 안녕나는현서 2021. 10. 14.
728x90

📌 문제

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

📌 문제 접근 방법

  1. 톱니바퀴의 상태를 deque을 이용해서 받아서 원형큐라고 생각하고 코드를 구현했다.
  2. 시계방향으로 회전일 경우, 맨 마지막 원소를 빼서 맨 첫 번째에 삽입해줬다.
  3. 반시계방향으로 회전일 경우, 맨 첫 번째 원소를 빼서 맨 마지막에 삽입해줬다.
  4. 그리고 회전이 일어나는 경우, 앞 뒤 바퀴와 원소를 비교해서 맞물린 부분이 다르면 해당 바퀴도 재귀로 회전을 시켜줬다.
    이 때, 이미 회전이 일어난 바퀴에 또 다시 회전이 일어나지 않도록 회전을 체크해주는 리스트를 따로 만들었다!
  5. 회전이 모두 끝난 후, 12시 방향 원소(0번째 원소)가 1이라면 점수를 더해줬다.

 

📌 코드

# 백준 14891 톱니바퀴
from collections import deque

def turn_left(wheel_num):
    global wheels

    check[wheel_num] = True

    if wheel_num - 1 >= 1 and not check[wheel_num-1]:
        if wheels[wheel_num-1][2] != wheels[wheel_num][6]:
            turn_right(wheel_num-1)
    
    if wheel_num + 1 <= 4 and not check[wheel_num+1]:
        if wheels[wheel_num][2] != wheels[wheel_num+1][6]:
            turn_right(wheel_num+1)
    
    wheel = wheels[wheel_num]
    wheel.append(wheel.popleft())
    wheels[wheel_num] = wheel


def turn_right(wheel_num):
    global wheels

    check[wheel_num] = True

    if wheel_num - 1 >= 1 and not check[wheel_num-1]:
        if wheels[wheel_num-1][2] != wheels[wheel_num][6]:
            turn_left(wheel_num-1)
    
    if wheel_num + 1 <= 4 and not check[wheel_num+1]:
        if wheels[wheel_num][2] != wheels[wheel_num+1][6]:
            turn_left(wheel_num+1)

    wheel = wheels[wheel_num]
    wheel.appendleft(wheel.pop())
    wheels[wheel_num] = wheel


wheels = {}
for i in range(1, 5):
    wheels[i] = deque(list(input()))

K = int(input())
for _ in range(K):
    # command : 1(시계방향, 오른쪽), -1(반시계방향, 왼쪽)
    wheel_num, command = map(int, input().split())
    check = [False for _ in range(5)]

    if command == 1:
        turn_right(wheel_num)
    elif command == -1:
        turn_left(wheel_num)

score = 0
for key, value in wheels.items():
    if value[0] == '1':
        score += 2**(key-1)

print(score)
728x90

'ALGORITHM > BAEKJOON' 카테고리의 다른 글

[BOJ/Python] 1717. 집합의 표현  (0) 2021.10.21
[BOJ/Python] 17144. 미세먼지 안녕!  (0) 2021.10.20
[BOJ/Python] 17471. 게리맨더링  (0) 2021.10.13
[BOJ/Python] 14503. 로봇 청소기  (0) 2021.10.13
[BOJ/Python] 5556. 타일  (0) 2021.10.09

댓글