코딩테스트/백준

[백준] 14891번: 톱니바퀴 (Python)

ye0nn 2023. 3. 27. 17:08

 

 

 

 

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

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

 

 

 

✅  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)