• 12주차 과제 - 행렬 바꾸기

image image image

  • 사용 언어 : python

  • 해결 날짜 : 2021-05-31

  • 느낀점 및 해결 과정 :

    • 순위를 저장할 순위 행렬을 전부 1로 초기화 시켜준다.
    • 입력한 행렬을 돌며 인덱스와 같이 heapq(최소힙)에 삽입한다.
    • change_matrix 함수를 통해 입력한 행렬을 각 행과 열에 따른 순위 행렬로 변경한다. 큐가 비어 있지 않은 동안, 큐에서 우선 순위가 가장 높은 값을 pop하여 그 인덱스가 있는 행과 열을 돌며 현재 인덱스의 값보다 크고, 현재 인덱스의 우선 순위보다 작다면 우선 순위를 현재 인덱스의 우선 순위 + 1로 수정한다.

    • 시간 복잡도 :

      • 최소힙에 삽입 : O(MN) (M = 행의 개수, N = 열의 개수)
      • change_matrix : O(MN*(M+N)) (M = 행의 개수, N = 열의 개수)
      • 따라서 O(MN + MN*(M+N)) = O(K2+2K3) = O(K3) 의 시간 복잡도를 갖는다. (K = 행 또는 열의 개수)
    • 코드
    import heapq
    
    # M = 행의 개수, N = 열의 개수, matrix = 행렬, priority = 순위 행렬
    M, N = map(int, input().split())
    matrix = [list(map(int, input().split())) for _ in range(M)]
    priority = [[1]*N for _ in range(M)]
    
    # 입력한 행렬을 돌며 인덱스와 같이 heapq(최소힙)에 삽입
    hq = []
    for i in range(len(matrix)):
        for j in range(len(matrix[i])):
            heapq.heappush(hq, (matrix[i][j], i, j))
    
    
    # 입력한 행렬을 각 행과 열에 따른 순위 행렬로 변경하는 함수
    def change_matrix():
        while hq: # 큐가 비어 있지 않을 때 반복
            val, row, col = heapq.heappop(hq)
            prior = priority[row][col] # 현재 우선 순위
            # 현재 인덱스의 행과 열을 돌며
            # 현재 인덱스의 값보다 크고, 현재 인덱스의 우선 순위보다 작다면
            # 우선 순위를 현재 인덱스의 우선 순위 + 1
            for i in range(M):
                if val < matrix[i][col] and prior >= priority[i][col]:
                    priority[i][col] = prior + 1
            for j in range(N):
                if val < matrix[row][j] and prior >= priority[row][j]:
                    priority[row][j] = prior + 1
    
    
    change_matrix()
    for i in priority:
        for j in i:
            print(j, end=' ')
        print()