기록하고 까먹지 말기

15662 본문

전공/백준

15662

yha97 2023. 5. 16. 21:21

날짜 : 2023. 05. 16

사용 언어 : python

 

문제

https://www.acmicpc.net/problem/15662

 

 

코드

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] 를 비교하는 과정에서 계속 숫자가 틀렸다.

- 한번에 풀긴 했지만 조금 지치는 문제였다.

- 확실히 근성이라고 해야하나, 피지컬이 늘어나는 느낌이었다.

- 역시 삼성 기출;;

 

 

참고 사이트

 

'전공 > 백준' 카테고리의 다른 글

1759  (0) 2023.05.20
1167  (0) 2023.05.18
9205  (0) 2023.05.16
1991  (0) 2023.05.15
20291  (0) 2023.05.14