취준/백준

[백준][Python][14891][시뮬레이션] 톱니바퀴

puff 2020. 2. 27. 18:13

문제 : 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,2,3,4,5,6,7,8] 일때

시계방향 ->  [8,1,2,3,4,5,6,7]

반시계방향 -> [2,3,4,5,6,7,8,1]

 

 

import sys

t = []
for _ in range(4):
    a = sys.stdin.readline().rstrip()
    t.append([int(a[i]) for i in range(len(a))])

cmd = []
n = int(input())
for _ in range(n):
    cmd.append([int(i) for i in sys.stdin.readline().split() ])


def rotate(lst, clockwise):
    if clockwise:
        return [lst[-1]] + lst[0:-1]

    else:
        return lst[1:] + [lst[0]]


for c in cmd:
    direct = [0]*4
    
    no = c[0]-1
    if c[1] ==1:
        direct[no] = 1
    else:
        direct[no] = -1

    for i in reversed(range(no)):

        if t[i][2] != t[i+1][6]:
            direct[i] = (-1)*direct[i+1]
        else:
            break

      

    for i in range(no+1,4):

        if t[i-1][2] != t[i][6]:
            direct[i] = (-1)*direct[i-1]
        else:
            break  

    for i in range(4):
        if direct[i] ==0:
            continue
        elif direct[i] == 1:
            t[i] = rotate(t[i],True)
        elif direct[i] == -1:
            t[i] = rotate(t[i],False)

print(t[0][0]*1 + t[1][0]*2 + t[2][0]*4 + t[3][0]*8)