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

resilient

·

2021. 12. 9. 13:22

728x90
반응형

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

  • 이 문제를 읽고 처음 든 생각은 '일단 톱니바퀴가 4개로 정해져 있기 때문에 다행이다'였습니다.
  • 먼저 톱니바퀴가 시계방향으로 돌 때, 반시계 방향으로 돌 때를 구현해주기 위해 함수 두 개를 만들어줬습니다.
  • 톱니바퀴가 4개밖에 없지만, 하나의 톱니바퀴를 돌릴 때 다른 톱니바퀴 들도 영향을 미치는 점을 고려해서 
    DFS로 풀어줬습니다.
  • 한 번 체크한 톱니바퀴는 방문처리를 해주고, 만약에 톱니바퀴가 돈다면, 영향을 준 이전 톱니바퀴의 반대 방향으로 돌도록 구현을 했습니다.
  • 다음 톱니바퀴에 영향을 주는지 안 주는지 (DFS로 넘어가는 조건)를 확인하는 if문을 걸어주고, dfs 재귀를 이용하면 DFS함수 구현은 끝이 납니다.
  • 그 이후로 톱니바퀴 각각의 맨 위 (인덱스 0 번째) 숫자가 1이면 각각 점수를 구해서 더해주면 값을 구할 수 있습니다.
import sys
input = sys.stdin.readline

graph = []
# N이 0 이고 S가 1이다.
for _ in range(4):
    graph.append(list(input().rstrip()))
k = int(input())
data = []

def rotate_clock(graph):
    temp = graph[7]
    for i in range(6,-1,-1):
        graph[i+1] = graph[i]
    graph[0] = temp

def rotate_ban_clock(graph):
    temp = graph[0]
    for i in range(7):
        graph[i] = graph[i+1]
    graph[7] = temp

def dfs(x,y):
    global visited
    if visited[x] == 0:
        visited[x] = 1
        left = graph[x][6]
        right = graph[x][2]
        if y == 1: # 시계방향일떄
            rotate_clock(graph[x])
        else:
            rotate_ban_clock(graph[x])
        if x-1 >= 0 and left != graph[x-1][2]:
            dfs(x-1,-y) # 방향은 지금 톱니바퀴가 도는 방향과 반대로 돈다.
        if x+1 <=3 and right != graph[x+1][6]:
            dfs(x+1,-y)

for _ in range(k):
    a,b = map(int,input().split())
    visited = [0] * 4
    dfs(a-1,b)

cnt = 0
for i in range(4):
    if graph[i][0] =='1':
        cnt += (2**i)
print(cnt)

 

반응형