Algorithm/Python

[백준 14891] 톱니바퀴

🥭맹2 2021. 4. 18. 14:22

1. 문제

www.acmicpc.net/problem/14891

 

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