본문 바로가기
  • _^**_
무근본 IT 지식 공유

[파이썬,C언어] 행렬 M에서, N번째로 큰 수를 찾아야 합니다.

by 크리드로얄워터 2023. 9. 17.
반응형

다음과 같은 문제가 있습니다.


문제에서는 M이라는 N * N 행렬이 있습니다.

이 행렬에서는 각각의 원소들이 분리되어 있습니다.

그리고 각각의 원소는 서로 다른 값을 가지고 있습니다.

이 행렬 M에서, N번째로 큰 수를 찾아야 합니다.

즉, 6 * 6 행렬에서 6번째로 큰 수를 찾는 것이 목표입니다.

이 문제에 대한 알고리즘을 설명해주시면 감사하겠습니다.

또한 수도코드도 같이 알려주시면 감사하겠습니다.

--------------------------------------------------



N * N 행렬에서 N번째로 큰 수를 찾는 문제에 대한 알고리즘은 다음과 같습니다.

1. **정렬 방법을 사용하는 알고리즘**:

    - 먼저, N * N 행렬의 모든 원소를 하나의 리스트에 넣습니다.
    - 이 리스트를 내림차순으로 정렬합니다.
    - 정렬된 리스트의 N-1번째 원소가 우리가 찾는 N번째로 큰 수입니다.

2. **힙 (Heap)을 사용하는 알고리즘**:

    - 모든 원소를 최소 힙에 넣습니다.
    - 힙에서 N-1번 원소를 제거합니다.
    - 그 다음 원소가 N번째로 큰 수입니다.

**수도코드** (정렬 방법을 사용하는 버전):


```pseudo
function findNthLargest(matrix, N):
    list = []
    
    for i from 0 to N-1:
        for j from 0 to N-1:
            list.append(matrix[i][j])
            
    list.sort(reverse=True)
    
    return list[N-1]
```

**수도코드** (힙을 사용하는 버전):


```pseudo
function findNthLargest(matrix, N):
    min_heap = []

    for i from 0 to N-1:
        for j from 0 to N-1:
            if len(min_heap) < N:
                add matrix[i][j] to min_heap
            else:
                if matrix[i][j] > min_heap[0]:
                    remove top element from min_heap
                    add matrix[i][j] to min_heap
                    
    return min_heap[0]
```

두 번째 힙을 사용하는 알고리즘이 시간적으로 조금 더 효율적일 수 있습니다. N * N 행렬의 경우, 정렬 방법은 O(N^2 log N^2)의 시간 복잡도를 가지며, 힙을 사용하는 방법은 O(N^2 log N)의 시간 복잡도를 가집니다.










반응형

댓글