ProblemSolving/구현, 시뮬레이션, 완전탐색

백준 14891 톱니바퀴 (Python)

OSNIM 2022. 3. 30. 20:43
반응형

문제

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

 

나의 접근법

먼저 문제를 보고 생각한 저의 제 플로우 차트입니다. 플로우 차트를 제대로 그린 것이 아니라 프로그램이 고려해야 되는 순서만을 빠르게 작성하고 디테일한 설정은 코드에서 구현하였습니다.

정답 코드 

import sys
from collections import deque
def checkRight(idx, clockWise):
    if idx > 3 or gears[idx-1][2] == gears[idx][6]:
        return
    if gears[idx-1][2] != gears[idx][6]:
        checkRight(idx+1, -clockWise)
        gears[idx].rotate(clockWise)

def checkLeft(idx, clockWise):
    if idx < 0 or gears[idx][2] == gears[idx + 1][6]:
        return
    if gears[idx][2] != gears[idx + 1][6]:
        checkLeft(idx-1, -clockWise)
        gears[idx].rotate(clockWise)

gears = []
for i in range(4):
    gears.append(deque(list(sys.stdin.readline().rstrip())))

#시작
K = int(sys.stdin.readline())
for i in range(K):
    gear, clockWise = map(int, sys.stdin.readline().split())
    # 시계 1, 반시계 -1
    checkRight(gear, -clockWise)
    checkLeft(gear-2, -clockWise)
    gears[gear-1].rotate(clockWise)

result = 0
for i in range(4):
    if gears[i][0] == '1':
        result += (2**i)

print(result)

- 이번 문제를 풀면서 deque 자료구조 안에 rotate 라는 함수가 있는 것을 알고 이를 활용했습니다.

  • gears[idx].rotate(1 또는 -1) 에서 rotate 변수가 1이면 시계방향, -1이면 반시계 방향입니다.

- 각 행별로 deque를 이용하기 위해서는 gears 리스트를 먼저 선언하고 그 안에 deque 자료 구조를 넣는 방식으로 구현했습니다. 

- 위 문제는 톱니바퀴의 상태를 띄어쓰기가 아닌 문자열로 이어지게 주었습니다. 그래서 1와 0을 정수로 구분하지 않고 '0', '1'로 구분하였습니다.

- checkRight() 또는 checkLeft() 를 할 때, idx를 처음에는 현재 idx를 넣어주었습니다. 예를 들어 1번 예제에서 3, -1 이 들어오는데 저는 3번 이니까 2번 인덱스의 톱니바퀴를 기준으로 생각했습니다. 그래서 checkRight()에 변수로 현재 톱니바퀴인 2를 넣었습니다. 하지만 이렇게 코딩을 하게 되면 gears[idx-1][2] != gears[idx][6]: 에서 왼쪽 바퀴를 비교 하게 되는 실수를 범하게 되어 오른쪽이 아닌 왼쪽의 톱니바퀴와 비교하는 에러가 발생하고 오답이 출력되었습니다.

checkRight(gear, -clockWise)
checkLeft(gear-2, -clockWise)
gears[gear-1].rotate(clockWise)

그래서 오른쪽 체크는 받은 번호 그대로 입력하고 왼쪽은 -2를 해서 인덱스를 -1로 변경시켜주고 현재 값은 -1로 넣어 현재 인덱스로 회전 시키게 만들었습니다.

매번 사소한 index나 예외 설정에서 잘못 판단하여 오답이 나와 멘붕되는 일이 발생하고 시간을 많이 뺏기고 있습니다.

조금씩 보완해서 1시간 내에 1문제 푸는 것을 달성해보고 싶습니다.

반응형