chldkato

백준 14891 톱니바퀴 (파이썬) 본문

백준

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

chldkato 2020. 4. 16. 16:31

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

1. 톱니바퀴의 상태를 a 리스트에 저장한다

2. 현재 상태에서 동시에 회전해야하기 때문에 turn 리스트에 각 톱니바퀴가 회전할 방향을 먼저 구한다

3. check_turn 함수에 회전할 톱니바퀴의 인덱스를 입력하여 좌우의 톱니바퀴를 회전해야 하는지 검사한다 

4. 모든 톱니바퀴를 앞서 구한 방향에 맞게 회전시킨다

5. 모든 회전을 끝낸 후 문제 조건에 맞는 답을 출력한다

import sys

input = sys.stdin.readline

def check_turn(i):
    if i+1 < 4:
        if turn[i+1] == 0 and a[i][2] != a[i+1][6]:
            turn[i+1] = turn[i] * -1
            check_turn(i+1)
    if i-1 >= 0:
        if turn[i-1] == 0 and a[i][6] != a[i-1][2]:
            turn[i-1] = turn[i] * -1
            check_turn(i-1)


a = []
for _ in range(4):
    row = list(map(int, input().strip()))
    a.append(row)

k = int(input())
for _ in range(k):
    idx, dir = map(int, input().split())
    turn = [0 for _ in range(4)]
    turn[idx-1] = dir
    check_turn(idx-1)
    for i in range(4):
        if turn[i] == 0:
            continue
        temp = [0 for _ in range(8)]
        if turn[i] == 1:
            for j in range(7):
                temp[j+1] = a[i][j]
            temp[0] = a[i][7]
        elif turn[i] == -1:
            for j in range(7, 0, -1):
                temp[j-1] = a[i][j]
            temp[7] = a[i][0]
        a[i] = temp

ans = 0
for i in range(4):
    ans += a[i][0] * pow(2, i)
print(ans)

Comments