https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
문제의 설명대로 말 그대로 "구현"하는 문제였다.
다만 문제의 조건을 이해하는 게 어려웠는데, 톱니바퀴가 회전 된 후의 상태로 비교하는 게 아니라 회전하기 전 상태를 기준으로 비교하는 것이라서 먼저 회전을 시키면.. 다음 번 톱니바퀴가 도는지 안도는지 확인할 때 어려움이 있었다.
톱니바퀴를 회전시킨다는 점에서 큐를 사용해야 한다는 것과, 재귀를 사용해야겠다는 아이디어가 떠올라 구현을 일단 해보았는데.. 처음에는 동시에 양쪽으로 가도록 구현을 했는데.. 이러니까 무한루프에 빠지게 되었다.😅
그래서 양쪽으로 가니까.. 왼쪽방향과 오른쪽방향 두 가지를 따로 생각해보았다. 그 방향으로 이동할 수 있고, 회전하는 경우면 재귀함수를 호출하고 마지막에 회전시키고 리턴하는 방식으로 구현했는데, 아니 이렇게 하니 또 처음 회전하는 바퀴가 두번이나 회전하게 되는것이다..!
그래서.. 그냥 왼쪽으로 한번 쭉 돌고 와서 처음 회전하는 바퀴를 다시 돌려놓았다...ㅋㅋ 더 좋은방법이 있을순 있겠지만.. 그냥 이렇게 할래..ㅠㅠ
구현하는 데 디테일한 부분이 어려운 게 많아 꽤 오래걸렸지만, 그래도 내 힘으로 끝까지 풀 수 있었어 나름 뿌듯했다...^^
import sys
from collections import deque
input = sys.stdin.readline
arr = []
for _ in range(4):
arr.append(deque(list(input().rstrip())))
def moveright(a,b):
if (a+1 < 4 and arr[a][2]!=arr[a+1][6]):
moveright(a+1, b*-1)
if (b==1):
arr[a].appendleft(arr[a].pop())
else:
arr[a].append(arr[a].popleft())
return
def moveleft(a,b):
if (a-1 >= 0 and arr[a][6]!=arr[a-1][2]):
moveleft(a-1, b*-1)
if (b==1):
arr[a].appendleft(arr[a].pop())
else:
arr[a].append(arr[a].popleft())
return
def solve(a, b):
moveright(a,b)
if (b==1): #다시 돌려놓음.
arr[a].append(arr[a].popleft())
else:
arr[a].appendleft(arr[a].pop())
moveleft(a,b)
return
K = int(input())
for _ in range(K):
a, b = map(int, input().split())
solve(a-1,b)
ans = 0
for i in range(4):
if (arr[i][0]=='1'):
ans += 2**i
print(ans)
'알고리즘💻 > 기타' 카테고리의 다른 글
프로그래머스 Lv.1 - 추억 점수 (0) | 2023.09.27 |
---|---|
프로그래머스 Lv.1 - 달리기 경주 (0) | 2023.09.27 |
BOJ 10610번: 30 (0) | 2021.07.19 |
BOJ 2155번: 삼각형의 최단 경로 (0) | 2021.05.26 |