1. 문제
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
2. 접근 방법
문제에 나온대로 차근차근 구현을 하면 됩니다
연결되어 있을 경우 홀수 톱니는 홀수끼리, 짝수 톱니는 짝수끼리 같은 방향으로 회전한다는 점에서 착안해
1. 연결된 톱니 구하기
2. [1, -1, 1, -1] 인지 [-1, 1, -1, 1]인지 구하기
3. 각각의 방향에 맞추어 톱니 회전해주기
로 진행했습니다.
그리고 idx를 바꾸면 디버깅하기 어려울 것 같아
그냥 톱니를 deque로 만들고
시계 방향 회전인 경우, 맨 뒤에 있는 요소를 맨 앞으로 넣어주고
반시계 방향 회전인 경우, 맨 앞에 있는 요소를 맨 뒤로 넣어줬습니다.
3. 코드
python
from collections import deque
def score():
ans = 0
for i in range(4):
if status[i][0] == 1:
ans += (2 ** i)
return ans
def rotate(i, d):
global status
# 반시계 방향
if d == -1:
a = status[i].popleft()
status[i].append(a)
# 시계 방향
elif d == 1:
a = status[i].pop()
status[i].appendleft(a)
def solve(i, d):
temp_dir = [[1, -1, 1, -1], [-1, 1, -1, 1]]
dir = temp_dir[0] if temp_dir[0][i] == d else temp_dir[1]
for i in range(4):
if connection[i]:
rotate(i, dir[i])
def isConnection(i):
global connection, visited
if not visited[i]:
visited[i] = True
if i-1 >= 0:
if status[i][6] + status[i-1][2] == 1:
connection[i-1] = True
isConnection(i-1)
if i+1 < 4:
if status[i][2] + status[i+1][6] == 1:
connection[i+1] = True
isConnection(i+1)
return
# 12시방향부터 시계방향 순서대로, N극은 0, S극은 1
status = [deque(list(map(int, input()))) for _ in range(4)]
K = int(input())
# (회전시킨 톱니바퀴의 번호, 1인경우 시계방향/-1인경우 반시계방향)
orders = [tuple(map(int, input().split())) for _ in range(K)]
for order in orders:
idx, dir = order[0]-1, order[1]
connection = [False]*4
visited = [False] * 4
connection[idx] = True
isConnection(idx)
solve(idx, dir)
print(score())
4. 마치며
마치며~!
'Algorithm > Python' 카테고리의 다른 글
[백준 15683] 감시 (0) | 2021.04.18 |
---|---|
[백준 15685] 드래곤 커브 (0) | 2021.04.18 |
[백준 14889] 스타트와 링크 (0) | 2021.04.18 |
[백준 14888] 연산자 끼워넣기 (0) | 2021.04.18 |
[백준 14503] 로봇 청소기 (0) | 2021.04.17 |