[Python][백준] 14891번 톱니바퀴

신남·2022년 9월 6일

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

공부 날짜 : 2022.09.06
정답 참조 여부 : X

톱니바퀴의 상태가 주어지고 조건에 따라 회전여부가 결정될 때 주어진 입력의 결과를 알아내는 문제로 회전여부를 판단하고 방향을 따져준 뒤 결과대로 회전만 시켜주면 되는 문제였다.


첫번째로 기존의 문제와 다른 입력방식으로 주어졌는데
보통 입력이 1 0 0 1 0 0 1 1 이런식으로 공백으로 주어지기에

list(map(int,input().split())

로 값을 입력받아왔으나 이번에는 10010011로 주어졌다
별 차이는 없으나 기존 입력방식을 생각하고 코드를 작성후 입력방식이 다르다는걸 알아서 입력을 받고 리스트 형태로 바꿔주는 작업을 해줬다.

data = [[] for _ in range(4)]
for i in range(4):
    a = input()
    for j in range(8):
        data[i].append(int(a[j]))

개인적으로 구현문제는 내가 생각하는 대로 만드는게 편해서
회전하는 바퀴를 기준으로 좌우 바퀴가 어떻게 회전하는지, 어떤방향으로 회전하는지 여부를 먼저 판단하고 회전을 시켜주었다.
판단 방식은
1. 입력된 톱니는 입력된 대로 회전
2. 톱니 index를 증가시키며 i-1톱니가 회전하고 사이 극이 회전가능하다면 반대방향으로 회전
3. 톱니 index를 감소시키며 i+1톱니가 회전하고 사이 극이 회전가능하다면 반대방향으로 회전
이런식으로 각 톱니의 회전여부와 방향을 나타내는 리스트를 만들었고
회전방향, 톱니리스트, 회전여부를 입력받아 결과 톱니를 반환하는 turn()함수를 만들어 회전시켜 주었다.

소스코드

import sys
from collections import deque
input = sys.stdin.readline

#톱니 상태 저장하는 배열
#좌는 6 우는 2
data = [[] for _ in range(4)]
for i in range(4):
    a = input()
    for j in range(8):
        data[i].append(int(a[j]))

k = int(input())

pass_ = []
#입력은 톱니 1,2,3,4 리스트에선 0,1,2,3
for _ in range(k):
    num,dir = map(int,input().split())
    pass_.append([num-1,dir])

#회전방향과 톱니리스트, 회전여부를 받아서 결과 톱니를 반환하는 함수
def turn(dir, circle, turn_bool):
    q = deque(circle)
    if turn_bool:
        #시계 방향
        if dir == 1:
            q.appendleft(q.pop())
        elif dir == -1:
            q.append(q.popleft())
            
    return list(q)

for j in range(k):
    #톱니 사이에서 회전하는 여부를 판단하는 배열
    check_turn = [[False]*4 for _ in range(4)]
    for i in range(3):
        if data[i][2] != data[i+1][6]:
            check_turn[i][i+1] = True
            check_turn[i+1][i] = True
            
    num, dir = pass_[j]

    #각 톱니의 회전 여부를 판단하는 배열            
    turn_bool = [[False,0] for _ in range(4)]
    turn_bool[num] = [True,dir]
    
    #회전하는 톱니 기준으로 오른쪽으로 가면서 판단
    for i in range(num+1,4):
        if turn_bool[i-1][0] and check_turn[i-1][i]:
            turn_bool[i] = [True, -turn_bool[i-1][1]]
            
    #회전하는 톱니 기준으로 왼쪽으로 가면서 판단
    for i in range(num-1,-1,-1):
        if turn_bool[i+1][0] and check_turn[i+1][i]:
            turn_bool[i] = [True, -turn_bool[i+1][1]]
            
    #회전
    for i in range(4):
        data[i] = turn(turn_bool[i][1], data[i][:], turn_bool[i][0])


            
    

result = 0

#점수처리
for i in range(4):
    if data[i][0] == 1:
        result += 2**i
        
print(result)

0개의 댓글