PS/Python

[백준] 14891 - 톱니바퀴 (파이썬, Python)

w00se 2021. 7. 8. 00:04

https://pixabay.com/ko/photos/우산-햇빛-여자-비-빛-6239364/

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

해당 문제는 구현 문제입니다.

문제의 목표는 k번 회전한 후 각 톱니바퀴의 12시 방향에 있는 극에 따라 점수를 계산하고 점수의 합을 구하는 것입니다.

톱니바퀴가 회전하는 경우는 두 가지로 나뉩니다.

 

1. 톱니바퀴를 직접 회전시킨다.

- 각 회차마다 회전시키는 톱니바퀴가 여기에 해당됩니다.

 

2. 옆 톱니바퀴에 의해서 회전된다.

- 인접한 톱니바퀴가 회전을 한다면 인접 부분의 극을 비교하여 회전 여부를 결정합니다.

- 인접 부분이 같은 극이면 현재 톱니바퀴를 회전시키지 않습니다.

- 인접 부분이 다른 극이면 인접한 톱니바퀴의 회전 방향과 반대의 방향으로 현재 톱니바퀴를 회전시킵니다.

 

위 규칙에 따라 구현한 코드는 아래와 같습니다.

 

전체 코드

제출 언어: Python3

시간: 72ms

import sys

def findRotatingGear(target, direction): # 회전 시킬 톱니바퀴를 찾는 함수
    global gears
    res = [0] * 4

    res[target] = direction
    
    # target을 기준으로 왼쪽 검사
    for i in range(target-1, -1, -1):
        if gears[i][2] == gears[i+1][6]:
            break
        
        res[i] = res[i+1] * -1

    # target을 기준으로 오른쪽 검사
    for i in range(target+1, 4):
        if gears[i][6] == gears[i-1][2]:
            break

        res[i] = res[i-1] * -1
    
    return res

def rotate(res): # 톱니바퀴를 회전 시키는 함수
    global gears

    for i in range(4):
        if res[i] == 0: # 해당 톱니바퀴는 회전시키지 않는다.
            continue

        elif res[i] == 1: # 해당 톱니바퀴는 시계 방향으로 회전시킨다.
            gears[i] = [gears[i][7]] + gears[i][0:7]

        else: # 해당 톱니바퀴는 시계 반대 방향으로 회전시킨다.
            gears[i] = gears[i][1:8] + [gears[i][0]]
            
    
if __name__ == "__main__":
    gears = [ list(map(int, list(sys.stdin.readline().strip()))) for _ in range(4) ]
    
    k = int(sys.stdin.readline().strip())

    rotatingInfo = [ tuple(map(int, sys.stdin.readline().strip().split())) for _ in range(k) ]

    for g, d in rotatingInfo:
        res = findRotatingGear(g-1, d)
        rotate(res)


    score = gears[0][0] + gears[1][0] * 2 + gears[2][0] * 4 + gears[3][0] * 8

    print(score)

읽어 주셔서 감사합니다 :)

틀린 부분이 있다면 댓글로 편히 알려주세요😊