https://www.acmicpc.net/problem/14891
✅ Solution
- 단순 구현 문제였는데, 이해하는데 시간이 좀 걸렸다.
- 잘못 생각했던 부분이 톱니바퀴가 차례로 움직인다고 생각했던 것!
- 그래서 3번 톱니바퀴를 회전 -> 2번, 4번 톱니바퀴를 확인한 뒤 회전 -> 또 1번 확인하고... 땡
- 위의 방법이 아니라 미리 어떤 톱니바퀴가 움직일지 체크한 뒤, 한 번에 회전하도록 코드를 수정했다.
- 회전시킬 톱니바퀴의 왼쪽 오른쪽을 나눠서 생각했다.
- 회전시킬 톱니바퀴의 왼쪽/오른쪽에 있는 톱니바퀴들 중 맞닿은 톱니바퀴의 극이 다른 경우, need_rotate 배열 안에 톱니바퀴의 번호와 방향을 넣어준다.
- 그리고 한 번에 톱니바퀴를 회전시켜 준 뒤, 점수를 계산해 준다.
✅ Code
import sys
input = sys.stdin.readline
from collections import deque
def cal_left(idx, check, direction):
# 비교할 톱니바퀴의 인덱스가 0 이라는 것은 제일 왼쪽에 위치한다는 의미이므로 비교할 필요 없음
if idx == 0:
return
# 현재 톱니바퀴와 그 왼쪽으로 위치한 톱니바퀴의 맞닿는 극 체크
if gear[idx][6] != gear[check][2]:
need_rotate.append((check, direction * (-1)))
# 계속해서 왼쪽 방향 체크
cal_left(idx - 1, check - 1, direction * (-1))
def cal_right(idx, check, direction):
# 비교할 톱니바퀴의 인덱스가 3 이라는 것은 제일 오른쪽에 위치한다는 의미이므로 비교할 필요 없음
if idx == 3:
return
# 현재 톱니바퀴와 그 오른쪽으로 위치한 톱니바퀴의 맞닿는 극 체크
if gear[idx][2] != gear[check][6]:
need_rotate.append((check, direction * (-1)))
# 계속해서 오른쪽 방향 체크
cal_right(idx + 1, check + 1, direction * (-1))
gear = [deque(map(int, input().rstrip())) for _ in range(4)]
k = int(input())
answer = 0
for _ in range(k):
need_rotate = []
g, d = map(int, input().split())
need_rotate.append((g - 1, d))
cal_left(g - 1, g - 2, d)
cal_right(g - 1, g, d)
# 톱니바퀴 회전
for idx, direction in need_rotate:
gear[idx].rotate(direction)
# 점수 계산
for i in range(4):
if gear[i][0] == 1:
answer += pow(2, i)
print(answer)
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 14499번: 주사위 굴리기 (Python) (0) | 2023.04.03 |
---|---|
[백준] 17144번: 미세먼지 안녕! (Python) (0) | 2023.03.28 |
[백준] 15685번: 드래곤 커브 (Python) (0) | 2023.03.27 |
[백준] 11404번: 플로이드 (0) | 2023.03.07 |
[백준] 16234번: 인구 이동 (Python) (0) | 2023.03.07 |