AI 공부 도전기

[Baekjoon] 14891번 : 톱니바퀴 (Python, 구현, 시뮬레이션)

 

     

 

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

코드 링크

https://github.com/stellaluminary/Baekjoon

 

GitHub - stellaluminary/Baekjoon

Contribute to stellaluminary/Baekjoon development by creating an account on GitHub.

github.com

 

Python

 

방법 1 - 메모리 30988KB / 시간 96ms / 코드 길이 898B

 

오른쪽 톱니바퀴에 따른 for문과 왼쪽 톱니바퀴에 따른 for문을 각각 고려하여 s를 재구성한다.

 

import copy
s = [[]]+[list(map(int, input())) for _ in range(4)]

for i in range(int(input())):
    n, d = map(int, input().split())
    t = copy.deepcopy(s)
    if d == 1:
        t[n] = [s[n][-1]] + s[n][:-1]
    else:
        t[n] = s[n][1:] + [s[n][0]]
    rot = d
    for i in range(n,4):
        rot = rot * -1
        if s[i][2] != s[i+1][6]:
            if rot == 1:
                t[i+1] = [s[i+1][-1]] + s[i+1][:-1]
            else:
                t[i+1] = s[i+1][1:] + [s[i+1][0]]
        else:
            break

    rot = d
    for i in range(n, 1, -1):
        rot = rot * -1
        if s[i-1][2] != s[i][6]:
            if rot == 1:
                t[i-1] = [s[i-1][-1]] + s[i-1][:-1]
            else:
                t[i-1] = s[i-1][1:] + [s[i-1][0]]
        else:
            break
    s = copy.deepcopy(t)

ans = 0
for i in range(1,5):
    ans += 2**(i-1) * s[i][0]
print(ans)

 

방법 2 - 메모리 32476KB / 시간 92ms / 코드 길이 701B

 

rotate를 통한 순서 바꿈과 더불어 재귀를 통한 방법을 사용한다.

 

from collections import deque

def rotate_right(x, d):
    if x > 4 or gears[x - 1][2] == gears[x][6]:
        return

    if gears[x - 1][2] != gears[x][6]:
        rotate_right(x + 1, -d)
        gears[x].rotate(d)

def rotate_left(x, d):
    if x < 1 or gears[x][2] == gears[x + 1][6]:
        return

    if gears[x][2] != gears[x + 1][6]:
        rotate_left(x - 1, -d)
        gears[x].rotate(d)

gears = {}
for i in range(1, 5):
    gears[i] = deque((map(int, input())))

for _ in range(int(input())):
    x, d = map(int, input().split())

    rotate_right(x + 1, -d)
    rotate_left(x - 1, -d)
    gears[x].rotate(d)

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

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading