-
[SWEA] 특이한 자석Algorithm Study/Python 2021. 10. 12. 01:47
https://swexpertacademy.com/main/main.do
풀이
처음 들어온 톱니바퀴의 이동에 따라서 주변에 있는 톱니바퀴로 어떻게 퍼져나가는지를
구현하면 된다.gears = [deque(map(int, input().split())) for _ in range(4)]
톱니바퀴는 회전을 쉽게 구현하기 위해서 deque로 생성했다.
def rotate(index, d): if d == 1: gears[index].appendleft(gears[index].pop()) elif d == -1: gears[index].append(gears[index].popleft())
톱니바퀴의 회전을 구현하였다.
톱니바퀴가 시계 방향으로 회전할 때는 마지막에 있는 원소를 pop한 뒤 0번에 붙여주고
시계 반대 방향으로 회전할 때는 첫번째 있는 원소를 pop한 뒤 마지막에 붙여줬다.K = int(input()) for _ in range(K): n, d = map(int, input().split()) n -= 1 move = [(n, d)] temp = d for i in range(n - 1, -1, -1): if gears[i][2] != gears[i + 1][6]: temp *= -1 move.append((i, temp)) else: break temp = d for i in range(n + 1, 4): if gears[i][6] != gears[i - 1][2]: temp *= -1 move.append((i, temp)) else: break
이제 회전 명령의 갯수인 K만큼 돌면서 회전이 옆 톱니로 퍼져나가게 구현했다.
왼쪽으로 퍼지는 방법은 처음 입력받은 방향 d를 기본으로 n - 1번 톱니부터 0번 톱니까지 반복하면서
현재 톱니의 2번(우측)이 나의 오른쪽 톱니의 6번(좌측)과 다른 경우 반대로 회전한다.(temp *= -1)오른쪽으로 퍼지는 방법은 처음 입력받은 방향 d를 기본으로 n - 1번 톱니부터 0번 톱니까지 반복하면서
현재 톱니의 6번(좌측)이 나의 왼쪽 톱니의 2번(우측)과 다른 경우 반대로 회전한다.(temp *= -1)회전은 연속적으로 퍼져나가기 때문에 부호가 반대가 아닌 경우에는 break로 반복문을 종료시켰다.
for idx, direction in move: rotate(idx, direction)
마지막에 move에 넣어둔 모든 인자를 이용해서 회전을 시키면 된다.
미리 회전을 시키면 연산이 복잡해지기 때문에 초기 상태에서 회전하는지 판단하고 마지막에 하는 것이 좋다.전체 코드
from collections import deque T = int(input()) def rotate(index, d): if d == 1: gears[index].appendleft(gears[index].pop()) elif d == -1: gears[index].append(gears[index].popleft()) for test_case in range(1, T+1): K = int(input()) gears = [deque(map(int, input().split())) for _ in range(4)] for _ in range(K): n, d = map(int, input().split()) n -= 1 move = [(n, d)] temp = d for i in range(n - 1, -1, -1): if gears[i][2] != gears[i + 1][6]: temp *= -1 move.append((i, temp)) else: break temp = d for i in range(n + 1, 4): if gears[i][6] != gears[i - 1][2]: temp *= -1 move.append((i, temp)) else: break for idx, direction in move: rotate(idx, direction) answer = 0 for i in range(4): if gears[i][0] == 1: answer += 2**i print(f"#{test_case} {answer}")
톱니의 회전이 어떻게 퍼져나가는지, 연산을 언제 수행할 것인지 고려하는 문제였다.
'Algorithm Study > Python' 카테고리의 다른 글
[백준] 11655번 ROT13 (1) 2024.01.16 [정올] 주사위 던지기1 (0) 2021.10.15 [SWEA] 활주로 건설 (0) 2021.10.11 [SWEA] 무선 충전 (0) 2021.10.11 [SWEA] 핀볼 게임 (0) 2021.10.10