문제
출처: 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문제 푸는 것을 달성해보고 싶습니다.
'ProblemSolving > 구현, 시뮬레이션, 완전탐색' 카테고리의 다른 글
백준 5373 큐빙 -(Python) (0) | 2022.04.03 |
---|---|
백준 15685 드래곤 커브 - (Python) (0) | 2022.04.01 |
백준 14890 경사로 (Python) (0) | 2022.03.30 |
백준 14503 로봇 청소기 (python) (0) | 2022.03.29 |
백준 2873 롤러코스터 (python) (0) | 2022.03.28 |