졍
지영이 블로그
졍
전체 방문자
오늘
어제
  • 분류 전체보기 (95)
    • 네트워크 (12)
    • 시스템설계 (6)
    • AWS (7)
    • Elasticsearch (3)
    • Python (5)
    • 자료구조, 알고리즘 (9)
    • 코딩테스트 (29)
    • NCP (8)
    • 운영체제 (7)
    • 개인 프로젝트 (8)
    • Github (1)
    • 여행 (0)
      • 2024동유럽 (0)
    • 대학원 (0)
      • 논문정리 (0)

최근 글

최근 댓글

hELLO · Designed By 정상우.
졍

지영이 블로그

[Python] 백준 14891번 - 톱니바퀴 (재귀)
코딩테스트

[Python] 백준 14891번 - 톱니바퀴 (재귀)

2023. 8. 2. 18:10

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


 

14891번: 톱니바퀴

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

www.acmicpc.net

 

 

https://jjung0326.tistory.com/96

 

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

문제: https://www.acmicpc.net/problem/14891 14891번: 톱니바퀴 첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다.

jjung0326.tistory.com

어제 하드코딩(?)으로 풀었던 문제를 재귀로 풀어보았다. (dfs가 아니었다 ㅎㅎ)

혼자 풀어보다가 잘 모르겠어서 풀이를 보고 해결했다.

몰랐는데, python rotate 함수를 쓰면 deque 내에서 자리를 간단하게 옮길 수 있었다!

 

Python deque.rotate()

deque 자료형에 대해 rotate 함수를 사용하면 자리를 쉽게 바꿀 수 있다.

함수의 인자로 양수를 양수를 주면 오른쪽으로 회전하고, 음수를 주면 왼쪽으로 회전하게 된다.

from collections import deque

test = deque([1, 2, 3, 4, 5])
test.rotate(1)
print(test)		# [5, 1, 2, 3, 4]

test.rotate(-2)
print(test)		# [2, 3, 4, 5, 1]

 

from collections import deque

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

k = int(input())
rotation = [tuple(map(int, input().split())) for _ in range(k)]

def rotate_right(gear, dir):
    # 회전하지 않는 경우
    if gear > 4 or gears[gear-1][2] == gears[gear][6]:
        return
    
    # 회전하는 경우
    if gears[gear-1][2] != gears[gear][6]:
        rotate_right(gear+1, -dir)      # 재귀
        gears[gear].rotate(dir)
        
def rotate_left(gear, dir):
    if gear < 1 or gears[gear][2] == gears[gear+1][6]:
        return
    
    if gears[gear][2] != gears[gear+1][6]:
        rotate_left(gear-1, -dir)
        gears[gear].rotate(dir)

for i in range(k):
    gear = rotation[i][0]
    dir = rotation[i][1]
    
    rotate_right(gear+1, -dir)
    rotate_left(gear-1, -dir)
    gears[gear].rotate(dir)

answer = 0
if gears[1][0] == 1:
    answer += 1
if gears[2][0] == 1:
    answer += 2
if gears[3][0] == 1:
    answer += 4
if gears[4][0] == 1:
    answer += 8
print(answer)

'코딩테스트' 카테고리의 다른 글

[Python] 백준 16234번 - 인구 이동  (0) 2023.08.07
[Python] 백준 18808번 - 스티커 붙이기  (0) 2023.08.04
[Python] 백준 14891번 - 톱니바퀴  (0) 2023.08.01
[Python] 백준 15686번 - 치킨 배달 (dfs 백트래킹)  (0) 2023.07.18
[Python] 백준 15686번 - 치킨 배달  (0) 2023.07.17
    졍
    졍

    티스토리툴바