[백준 14891번] 톱니바퀴 - Python으로 구현하기

 

문제 접근

  • 주어진 문제는 구현 문제로 처음에 너무 어려워보였다. 쫄지말고 차근차근 접근하는 것이 필요.
  • 우선 톱니바퀴를 자료형으로 어떻게 표현 할 것인지, 주어진 조건에 따라 돌리는 경우, 안돌리는 경우를 어떻게 구현 할 것인지 부터 접근하자.
  • 톱니바퀴의 표현 : deque(index는 12시방향부터 시계방향으로 0~7을 가진다.)
  • 회전하는 경우 : 주어진 시작 톱니를 회전하고 왼쪽방향, 오른쪽방향 나누어서 돌린다. 도중에 맞닿은 부분이 같은 극인 경우 반복문 탈출
  • 참고 : 원형 돌리기 문제는 deque의 rotate 메소드를 쓰면 편하게 구현가능하다.

생각해볼 점

  • deque 와 list의 상황 별 시간복잡도가 어떻게 되는지 다시 한번 정리 필요
  • 재귀로 도전?

 

오답 분석

  • 1번, 4번 톱니가 시작인 경우 인덱스 처리를 잘못해주어 오류가 난 경우가 많아 보인다. 주의!

 

from collections import deque

circle = [deque(map(int,input())) for _ in range(4)]
opers = deque(list(map(int,input().split())) for _ in range(int(input())))

while opers:	# 명령어가 남아 있으면 반복문 실행
    num,direct = opers.popleft()
    num-=1  # 0 index
    tmp_2 = circle[num][2]	# 비교 대상 백업
    tmp_6 = circle[num][6]	# 비교 대상 백업
    circle[num].rotate(direct)	# 일단 시작 톱니 돌려주기
    tmp_direct=direct
    
    # 시작 톱니 왼쪽 방향
    direct=tmp_direct
    for i in range(num-1,0-1,-1):
        if circle[i][2]!=tmp_6:		# 서로 다른 극인 경우
            tmp_6=circle[i][6]
            circle[i].rotate(direct*-1)
            direct*=-1
        else:
            break

    # 시작 톱니 오른쪽 방향
    direct=tmp_direct
    for i in range(num+1,4):
        if circle[i][6]!=tmp_2:		# 서로 다른 극인 경우
            tmp_2 = circle[i][2]
            circle[i].rotate(direct*-1)
            direct*=-1
        else:
            break

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

 

* 틀린 부분이나 더 나은 방법이 있을 수 있습니다. 지적해주시면 감사하겠습니다!!

+ Recent posts