ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 특이한 자석
    Algorithm Study/Python 2021. 10. 12. 01:47

    https://swexpertacademy.com/main/main.do

     

    SW Expert Academy

    SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

    swexpertacademy.com

    풀이

    처음 들어온 톱니바퀴의 이동에 따라서 주변에 있는 톱니바퀴로 어떻게 퍼져나가는지를
    구현하면 된다.

        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

    댓글

From BlackHair