[백준 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)
* 틀린 부분이나 더 나은 방법이 있을 수 있습니다. 지적해주시면 감사하겠습니다!!
'posts' 카테고리의 다른 글
[백준 17142번] 연구소 3 - Python으로 구현하기 (0) | 2019.10.18 |
---|---|
[백준 15684번] 사다리 조작 - Python으로 구현하기 (0) | 2019.10.18 |
[백준 14890번] 경사로 - Python으로 구현하기 (0) | 2019.10.18 |
[백준 14889번] 스타트와 링크 - Python으로 구현하기 (0) | 2019.10.17 |
[백준 14888번] 연산자 끼워넣기 - Python으로 구현하기 (0) | 2019.10.17 |