https://www.acmicpc.net/problem/14891
문제의 설명대로 말 그대로 "구현"하는 문제였다.
다만 문제의 조건을 이해하는 게 어려웠는데, 톱니바퀴가 회전 된 후의 상태로 비교하는 게 아니라 회전하기 전 상태를 기준으로 비교하는 것이라서 먼저 회전을 시키면.. 다음 번 톱니바퀴가 도는지 안도는지 확인할 때 어려움이 있었다.
톱니바퀴를 회전시킨다는 점에서 큐를 사용해야 한다는 것과, 재귀를 사용해야겠다는 아이디어가 떠올라 구현을 일단 해보았는데.. 처음에는 동시에 양쪽으로 가도록 구현을 했는데.. 이러니까 무한루프에 빠지게 되었다.😅
그래서 양쪽으로 가니까.. 왼쪽방향과 오른쪽방향 두 가지를 따로 생각해보았다. 그 방향으로 이동할 수 있고, 회전하는 경우면 재귀함수를 호출하고 마지막에 회전시키고 리턴하는 방식으로 구현했는데, 아니 이렇게 하니 또 처음 회전하는 바퀴가 두번이나 회전하게 되는것이다..!
그래서.. 그냥 왼쪽으로 한번 쭉 돌고 와서 처음 회전하는 바퀴를 다시 돌려놓았다...ㅋㅋ 더 좋은방법이 있을순 있겠지만.. 그냥 이렇게 할래..ㅠㅠ
구현하는 데 디테일한 부분이 어려운 게 많아 꽤 오래걸렸지만, 그래도 내 힘으로 끝까지 풀 수 있었어 나름 뿌듯했다...^^
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 |