[BOJ] 톱니바퀴

김가영·2021년 3월 3일
0

Algorithm

목록 보기
65/78
post-thumbnail

14891 톱니바퀴

import sys
from collections import deque
input = sys.stdin.readline


def turn(cnt, dir): # cnt : 톱니바퀴 번호, 방향(1: 시계, False:반시계)
    global ctop

    # 톱니바퀴 회전
    if dir :
        ctop[cnt] += 7
        ctop[cnt] %= 8
    else:
        ctop[cnt] += 1
        ctop[cnt] %= 8


def getScore():
    return int(tob[0][ctop[0]]) * 1 + int(tob[1][ctop[1]]) * 2 + int(tob[2][ctop[2]]) * 4 + int(tob[3][ctop[3]]) * 8

tob = []
ctop = [0,0,0,0] # 현재 12시 방향에 위치한 톱니바퀴
for _ in range(4):
    tob.append(list(input().strip()))
k = int(input())
for _ in range(k):
    cnt, dir = list(map(int, input().split()))
    dir = True if dir == 1 else False
    cnt -=1

    # 오른쪽 톱니바퀴 회전
    nxt = cnt
    while nxt < 3 and tob[nxt][(ctop[nxt] + 2)%8] != tob[nxt+1][(ctop[nxt+1]+6)%8]:
        nxt += 1
    ndir = dir
    for i in range(cnt + 1, nxt + 1):
        ndir = not ndir
        turn(i, ndir)

    # 왼쪽 톱니바퀴 회전
    nxt = cnt
    while nxt > 0 and tob[nxt-1][(ctop[nxt-1] + 2)%8] != tob[nxt][(ctop[nxt] + 6)%8]:
        nxt -=1
    ndir = dir
    for i in range(cnt - 1, nxt - 1, -1):
        ndir = not ndir
        turn(i, ndir)

    turn(cnt, dir)

print(getScore())

문제에서 헷갈렷던 점은, 톱니바퀴를 회전하기 전의 톱니바퀴를 비교하여 회전할 지 여부를 결정해야한다는 것.

    # 오른쪽 톱니바퀴 회전
    nxt = cnt
    while nxt < 3 and tob[nxt][(ctop[nxt] + 2)%8] != tob[nxt+1][(ctop[nxt+1]+6)%8]:
        nxt += 1
    ndir = dir
    for i in range(cnt + 1, nxt + 1):
        ndir = not ndir
        turn(i, ndir)

    # 왼쪽 톱니바퀴 회전
    nxt = cnt
    while nxt > 0 and tob[nxt-1][(ctop[nxt-1] + 2)%8] != tob[nxt][(ctop[nxt] + 6)%8]:
        nxt -=1
    ndir = dir
    for i in range(cnt - 1, nxt - 1, -1):
        ndir = not ndir
        turn(i, ndir)

    turn(cnt, dir)
   

오른쪽과 왼쪽 각각 회전 가능한 index 까지 nxt 를 증가/감소 시킨 후 해당 톱니바퀴들을 회전시켜줬다.
양쪽 톱니바퀴를 모두 회전한 후에 해당 톱니바퀴를 회전시킨다.

profile
개발블로그

0개의 댓글