Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 재귀
- 우선순위큐
- 분할정복
- 해시
- join
- 그리디
- 플로이드-워셜
- 에라토스테네스의 체
- 트리
- 자료구조
- 다이나믹프로그래밍
- 백트래킹
- DFS
- 브루트포스
- 다이나믹 프로그래밍
- 크루스칼
- 투포인터
- 다익스트라
- 수학
- 구현
- 시뮬레이션
- GROUP BY
- 누적합
- BFS
- 그래프 이론
- 서브쿼리
- 다시
- 그래프 탐색
- DP
- MST
Archives
- Today
- Total
기록하고 까먹지 말기
15662 본문
날짜 : 2023. 05. 16
사용 언어 : python
문제
코드
import sys
from collections import deque
def spin(num, dir, goto):
if goto == 0: # 처음 -> 양쪽으로
if num > 0: # 끝이 아닌 경우(좌로이동)
if gear[num][6] != gear[num-1][2]: # 서로 부호가 다른 경우 -> 반대 방향으로 회전
spin(num-1, dir*(-1), -1)
if num < len(gear)-1: # 우측방향
if gear[num][2] != gear[num+1][6]:
spin(num + 1, dir * (-1), 1)
elif goto == 1: # 우측방향
if num < len(gear)-1: # 끝이 아닌 경우
if gear[num][2] != gear[num+1][6]:
spin(num + 1, dir * (-1), 1)
elif goto == -1: # 좌측방향
if num > 0: # 범위체크
if gear[num][6] != gear[num-1][2]: # 서로 부호가 다른 경우 -> 반대 방향으로 회전
spin(num-1, dir*(-1), -1)
# spin
if dir == 1: # 시계방향
temp = gear[num].pop()
gear[num].appendleft(temp)
elif dir == -1: # 반시계방향
temp = gear[num].popleft()
gear[num].append(temp)
return
t = int(sys.stdin.readline()) # 톱니바퀴 개수
gear = list()
for _ in range(t): # 입력
temp = ' '.join(sys.stdin.readline().rstrip()).split()
queue = deque()
for i in temp: queue.append(i)
gear.append(queue)
k = int(sys.stdin.readline()) # 회전 횟수
for _ in range(k):
num, dir = map(int, sys.stdin.readline().split()) # 톱니바퀴 번호, 방향(1 : 시계 / -1 : 반시계)
num -= 1
spin(num, dir, 0)
res = 0
for i in gear:
if i[0] == '1':
res += 1
#print(i)
print(res)
풀이
- 가장 처음의 회전기어는 goto를 0으로 설정, spin 함수에서 첫 번째 회전 기어 기준 바깥쪽부터 회전한다.
(만약 처음 기어부터 회전하면 재귀 방식이기 때문에 양옆 기어에도 영향을 주기 때문)
- 그렇기에 예컨대 3번 기어부터 회전하는 경우 2, 4번 기어까지 회전여부 확인 후 회전 -> 3번을 회전한다.
- spin 함수에서 첫 회전기어의 경우 양쪽으로 영향을 줄 수 있기 때문에 범위를 체크하고 양쪽으로 확산하며 오른쪽은 1, 왼쪽은 -1로 구분한다.
- 이후 goto 변수에 따라 범위 체크 후 서로 다른 극이라면 기존 진행방향으로 재귀, 아니라면 회전한다.
- 회전하는 케이스는 반시계방향, 시계방향이고 다음과 같은 방식으로 나타난다.
12방향이기 때문에 각각 3시와 9시는 입력받은 데크의 6, 2번 인덱스이다.
- 반시계 방향의 경우 가장 왼쪽의 원소를 pop 후 가장 오른쪽에 삽입, 반시계는 반대로 진행한다.
(우측 하단의 same 관련해서는 필요 없는 내용)
알게된 점
- gear[n][2] 와 gear[n+1][6]을 비교 또는 gear[n][6] 과 gear[n-1][2] 를 비교하는 과정에서 계속 숫자가 틀렸다.
- 한번에 풀긴 했지만 조금 지치는 문제였다.
- 확실히 근성이라고 해야하나, 피지컬이 늘어나는 느낌이었다.
- 역시 삼성 기출;;
참고 사이트
-