BOJ :: 톱니 바퀴 (no.14891)

숑숑·2022년 1월 16일
0

알고리즘

목록 보기
119/122
post-thumbnail

문제

문제 바로가기

생각

  • 거의 바로 비트 마스킹을 생각했다.
  • 톱니가 N극, S극 총 두 개만으로 나눠지며
  • 톱니바퀴의 회전을 단순 시프트 연산 만으로 구현할 수 있기 때문이다.

알고리즘 문제에서 비트 마스킹의 단점이 있다면,
가독성과 디버깅 용이성인것 같다.
너무 사소한 것에서 한참 헤맸다..

Solution

import sys
input = sys.stdin.readline

def getResult():
    result = 0
    scores = tuple((1,2,4,8))

    for gear, score in zip(gears, scores):
        if gear & (1 << 7): 
            result += score

    return result

def setLeftDirection(gear, directions):
    for i in reversed(range(1, gear+1)):
        left = right = 'N'
        if gears[i-1] & (1 << 5): left = 'S'
        if gears[i] & (1 << 1): right = 'S'

        if left == right: break
        directions[i-1] = -directions[i]

def setRightDirection(gear, directions):
    for i in range(gear, 3):
        left = right = 'N'
        if gears[i] & (1 << 5): left = 'S'
        if gears[i+1] & (1 << 1): right = 'S'

        if left == right: break
        directions[i+1] = -directions[i]

def rotate(directions):
    for i in range(4):
        if directions[i] == 1:
            lastBit = True if gears[i] & 1 else False
            gears[i] >>= 1
            if lastBit:
                gears[i] |= (1 << 7)
        
        if directions[i] == -1:
            firstBit = True if gears[i] & (1 << 7) else False
            gears[i] <<= 1
            if firstBit:
                gears[i] &= ~(1 << 8)
                gears[i] += 1

def roll(gear, direction):
    directions = [0]*4
    directions[gear] = direction

    setLeftDirection(gear, directions)
    setRightDirection(gear, directions)
    rotate(directions)

gears = [int(input(), 2) for _ in range(4)]

k = int(input())
for _ in range(k):
    gear, direction = map(int, input().split())
    roll(gear-1, direction)

print(getResult())
profile
툴 만들기 좋아하는 삽질 전문(...) 주니어 백엔드 개발자입니다.

0개의 댓글