Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 행별로 정렬된 행렬에서 모든 행의 공통 요소 찾기

각 행이 오름차순으로 정렬되어 있는 행렬이 있다고 가정해 보겠습니다. 이때 모든 행에 공통으로 존재하는 요소를 찾는 함수를 작성해야 합니다. 예를 들어 다음과 같은 행렬이 있다고 합시다.

C++로 행별로 정렬된 행렬에서 모든 행의 공통 요소 찾기

이 경우 결과는 5가 됩니다.

해결 접근 방식

이 문제는 해시(Hash) 기반 방식을 사용하면 효율적으로 해결할 수 있습니다. 특히 이 방법은 행이 정렬되어 있지 않은 경우에도 동일하게 적용할 수 있다는 장점이 있습니다. 알고리즘의 동작 순서는 다음과 같습니다.

  1. 행렬에 등장하는 고유한 값들을 키(key)로 하는 해시 테이블을 생성하고, 모든 값을 0으로 초기화합니다.
  2. 행렬의 모든 요소를 순회하면서, 해당 숫자가 해시 테이블에 존재하면 개수(count)를 1씩 증가시킵니다. 단, 한 행 내에서 같은 값이 중복해서 카운트되지 않도록 주의합니다.
  3. 순회가 끝난 후, 개수가 행의 개수(M)와 같은 값이 있는지 확인합니다. 그러한 값이 존재한다면 그것이 바로 모든 행에 공통으로 나타나는 요소입니다.

예제 코드

#include<iostream>
#include<unordered_map>
#define M 4
#define N 5
using namespace std;
int getCommonElement(int matrix[M][N]) {
    unordered_map<int, int> count;
    int i, j;
    for (i = 0; i < M; i++) {
        count[matrix[i][0]]++;
        for (j = 1; j < N; j++) {
            if (matrix[i][j] != matrix[i][j - 1])
            count[matrix[i][j]]++;
        }
    }
    for (auto ele : count) {
        if (ele.second == M)
        return ele.first;
    }
    return -1;
}
int main() {
    int matrix[M][N] = {
        { 1, 2, 3, 4, 5 },
        { 2, 4, 5, 8, 10 },
        { 3, 5, 7, 9, 11 },
        { 1, 3, 5, 7, 9 },
    };
    int result = getCommonElement(matrix);
    if (result == -1)
        cout << "No common element has found";
    else
        cout << "Common element is " << result;
}

실행 결과

Common element is 5

코드 설명 및 시간 복잡도

위 코드에서는 unordered_map을 사용하여 각 요소가 몇 개의 행에서 등장했는지를 기록합니다. 내부 조건문 matrix[i][j] != matrix[i][j-1]은 현재 값이 바로 앞의 값과 같은 경우 카운트하지 않음으로써, 같은 행 내에서 중복 계산되는 것을 방지합니다. 최종적으로 개수가 총 행의 개수인 M과 일치하는 요소를 반환하며, 공통 요소가 없다면 -1을 반환합니다.

시간 복잡도는 행렬의 모든 요소를 한 번씩 순회하므로 O(M×N)이며, 공간 복잡도는 해시 테이블에 저장되는 고유 요소의 수에 비례하여 O(N)입니다. 이 방식은 행이 정렬되어 있지 않아도 정상적으로 동작하기 때문에 일반적인 상황에서도 유용하게 활용할 수 있습니다.