ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14891. [Python]톱니바퀴
    Python_알고리즘/Gold V 2024. 8. 7. 21:24

    1. 문제

     

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

     

     

    2. 접근 방법

     

    • 시간 제한: 2초
    • 메모리 제한: 512MB
    • 구현
    • 시뮬레이션

     

    3. 파이썬 코드

     

    import sys
    from collections import deque
    # 시계 방향 회전
    def right(target):
        check = matrix[target].pop()
        matrix[target].appendleft(check)
    # 반시계 방향 회전
    def left(target):
        check = matrix[target].popleft()
        matrix[target].append(check)
    # 연결된 톱니바퀴 체크
    def DFS(start,dir):
        # 방문처리를 통해 연결된 톱니바퀴 회전
        visited = [0,0,0,0]
        visited[start-1] = 1
        # 첫 톱니바퀴 회전
        if dir == -1:
            left(start-1)
        else:
            right(start-1)
        queue = deque([start-1])
        # 연결된 톱니바퀴 중 극이 다른 톱니바퀴 회전 시킴
        while queue:
            next = queue.popleft()
            if next != start-1:
                if next%2 != (start-1)%2:
                    if dir == -1:
                        right(next)
                    else:
                        left(next)
                else:
                    if dir == -1:
                        left(next)
                    else:
                        right(next)
            for k in range(4):
                if flag[next][k] == 1 and visited[k] == 0:
                    visited[k] = 1
                    queue.append(k)
    
    input = sys.stdin.readline
    
    matrix = [deque(list(map(int,input().strip()))) for _ in range(4)]
    
    K = int(input())
    
    for _ in range(K):
        number, direction = map(int,input().split())
        flag = [[0,0,0,0] for _ in range(4)]
        # 처음 톱니바퀴들의 상태를 돌며 극이 다른 톱니바퀴들을 flag 라는 2차원 배열로 체크
        for i in range(4):
            if i == 0:
                if matrix[i][2] != matrix[i+1][6]:
                    flag[i][i+1] = 1
            elif i == 3:
                if matrix[i][6] != matrix[i-1][2]:
                    flag[i][i-1] = 1
            else:
                if matrix[i][2] != matrix[i+1][6]:
                    flag[i][i+1] = 1
                
                if matrix[i][6] != matrix[i-1][2]:
                    flag[i][i-1] = 1
        
        DFS(number,direction)
    # 정답을 계산할 반복문
    answer = 0
    for k in range(4):
        # S극의 경우 2**n 으로 점수를 계산
        if matrix[k][0] == 1:
            answer += 2**k
    print(answer)

     

    4. 문제를 풀고난 후 생각

     

    • 시뮬레이션 문제의 경우 직접 그려가면서 어떻게 동작하는지를 파악하면 코드로 구현하는 문제이다.
    • 처음 했던 생각은 톱니바퀴가 어떻게 돌아야 하는지를 먼저 생각했고, 연결된 부분에 대해서 어떤 식으로 표현할지를 고민했다.

     

    • 위와 같은 경우 3번이 처음 반시계로 돌게되면 양 옆의 톱니바퀴는 시계로 돌고 1번의 경우는 반시계로 도는 동작을 하게되는 것을 알았다.
    • 이렇게 각 연결된 톱니바퀴들이 극이 다른 경우 flag의 2차원 배열을 통해서 1로 극이 다른 것을 인지시켰고, DFS를 돌면서 시작점과 연결된 톱니 바퀴 중 극이 다른 경우 deque() 리스트에 추가시켰고, 인덱스 번호에 따라서 %2 나머지 연산을 통해서 양 옆에 붙은 것인지 멀리 떨어진 부분인지에 따라서 돌리는 방향을 다르게 설정했다.

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 구현
    • 시뮬레이션

    'Python_알고리즘 > Gold V' 카테고리의 다른 글

    2866. [Python]문자열 잘라내기  (0) 2024.08.19
    2866. [Python]문자열 잘라내기  (0) 2024.08.13
    2589. [Python]보물섬  (0) 2024.08.06
    2470. [Python]두 용액  (0) 2024.07.29
    2212. [Python]센서  (0) 2024.07.12

    댓글

Designed by Tistory.