Coding Test/Python

[백준] 14891번: 톱니바퀴 (골드5, 파이썬)

lim.dev 2023. 12. 30. 20:09

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

아이디어

요구사항에 맞게 구현하는 문제였다. 

처음에는 문제를 잘못 이해해서 1시간동안 연쇄 반응으로 회전하는 (회전 후 근처 톱니바퀴의 극이 다르면 회전..) 코드를 작성했는데, 알고보니 처음 상태에서 회전할 톱니바퀴와 방향만 알아낸 뒤 회전하는거였다. 

 

rotaion 메서드: 회전

우선 회전하는 메서드는 회전할 톱니바퀴 정보와 방향을 받도록 했다.

def rotation(n, d):

    if d == -1: #반시계 방향으로 회전
        tmp_gear = gears[n][0]
        for i in range(7): gears[n][i] = gears[n][i+1]
        gears[n][7] = tmp_gear

    if d == 1: #시계 방향으로 회전
        tmp_gear = gears[n][7]
        for i in range(7, 0, -1): gears[n][i] = gears[n][i-1]
        gears[n][0] = tmp_gear

    return

스왑해주는 로직을 그대로 사용했다.

 

회전할 톱니바퀴 정보와 방향 정보 얻기

연쇄가 아닌 한 큐에 돌리는거기 때문에 먼저 회전할 톱니바퀴와 방향 정보를 얻어준다.

    rs = [(n,d)]
    
	rdir = -d
    for i in range(n, 0, -1):
        if gears[i][6] != gears[i-1][2]:
            rs.append((i-1, rdir))
            rdir = -rdir
            continue
        break
    
    rdir = -d
    for i in range(n, 3):
        if gears[i][2] != gears[i+1][6]:
            rs.append((i+1, rdir))
            rdir = -rdir
            continue
        break

 

rs에 처음에 들어온 정보를 먼저 넣어준 뒤, 회전할 톱니바퀴를 기준으로 왼쪽에 있는 톱니바퀴의 회전 정보를 먼저 검사한다. 

만약 극이 같아 회전하지 않아도 된다면 break으로 반복문을 탈출해준다.

오른쪽에 있는 톱니바퀴의 회전정보도 같은 방법으로 얻는다.

 

그 후 rs에 있는 정보대로 한꺼번에 rotation 하면 된다.

    for x, y in rs:
        rotation(x, y)

 

 

전체 코드

# s = 1, n = 0


def rotation(n, d):

    if d == -1: #반시계 방향으로 회전
        tmp_gear = gears[n][0]
        for i in range(7): gears[n][i] = gears[n][i+1]
        gears[n][7] = tmp_gear

    if d == 1: #시계 방향으로 회전
        tmp_gear = gears[n][7]
        for i in range(7, 0, -1): gears[n][i] = gears[n][i-1]
        gears[n][0] = tmp_gear

    return

def solution(n, d):

    rs = [(n,d)]

    rdir = -d
    for i in range(n, 0, -1):
        if gears[i][6] != gears[i-1][2]:
            rs.append((i-1, rdir))
            rdir = -rdir
            continue
        break
    
    rdir = -d
    for i in range(n, 3):
        if gears[i][2] != gears[i+1][6]:
            rs.append((i+1, rdir))
            rdir = -rdir
            continue
        break

    for x, y in rs:
        rotation(x, y)



gears = [[int(x) for x in input()] for _ in range(4)]
K = int(input()) # 회전 횟수
info = [tuple(map(int, input().split())) for _ in range(K)]

for n, d in info: solution(n-1, d)

answer = 0
for i in range(4):
    if gears[i][0] == 1:
        answer += 2**i



print(answer)

 

문제를 제대로 파악하고 나서는 기존 코드를 고치며 솔브까지 21분 정도 걸렸다. ...다음부터는 문제를 꼼꼼히 읽어야겠다...ㅠㅠ