728x90
📌 문제
https://www.acmicpc.net/problem/14891
📌 문제 접근 방법
- 톱니바퀴의 상태를 deque을 이용해서 받아서 원형큐라고 생각하고 코드를 구현했다.
- 시계방향으로 회전일 경우, 맨 마지막 원소를 빼서 맨 첫 번째에 삽입해줬다.
- 반시계방향으로 회전일 경우, 맨 첫 번째 원소를 빼서 맨 마지막에 삽입해줬다.
- 그리고 회전이 일어나는 경우, 앞 뒤 바퀴와 원소를 비교해서 맞물린 부분이 다르면 해당 바퀴도 재귀로 회전을 시켜줬다.
이 때, 이미 회전이 일어난 바퀴에 또 다시 회전이 일어나지 않도록 회전을 체크해주는 리스트를 따로 만들었다! - 회전이 모두 끝난 후, 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 |
댓글