2092. 비밀이 있는 모든 사람 찾기

발행: (2025년 12월 19일 오전 10:55 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

Problem Description

정수 n이 주어집니다. 이는 0부터 n - 1까지 번호가 매겨진 사람 n명이 존재한다는 의미입니다.
또한 0‑인덱스 2차원 정수 배열 meetings가 주어지는데, meetings[i] = [xᵢ, yᵢ, timeᵢ]는 사람 xᵢ와 사람 yᵢtimeᵢ에 만나게 된다는 것을 나타냅니다. 한 사람은 같은 시간에 여러 회의에 참석할 수 있습니다.

마지막으로 정수 firstPerson이 주어집니다.

사람 0은 비밀을 가지고 있으며, 초기에는 시간 0firstPerson에게 비밀을 공유합니다. 이후 비밀은 비밀을 가진 사람과 회의가 열릴 때마다 공유됩니다. 보다 정확히 말하면, 각 회의에 대해 xᵢtimeᵢ에 비밀을 가지고 있다면 yᵢ에게 비밀을 공유하고, 반대로도 마찬가지입니다.

비밀은 즉시 공유됩니다. 즉, 한 사람이 비밀을 받은 직후 같은 시간대에 열리는 다른 회의에서도 비밀을 전달할 수 있습니다.

모든 회의가 끝난 후 비밀을 가지고 있는 모든 사람의 리스트를 반환하세요. 답은 어떤 순서로든 반환해도 됩니다.

Examples

Example 1

Input: n = 6, meetings = [[1,2,5],[2,3,8],[1,5,10]], firstPerson = 1
Output: [0,1,2,3,5]

Explanation:

  • 시간 0에 사람 0이 사람 1에게 비밀을 공유합니다.
  • 시간 5에 사람 1이 사람 2에게 비밀을 공유합니다.
  • 시간 8에 사람 2가 사람 3에게 비밀을 공유합니다.
  • 시간 10에 사람 1이 사람 5에게 비밀을 공유합니다.

따라서 모든 회의가 끝난 뒤 사람 0, 1, 2, 3, 5가 비밀을 알게 됩니다.

Example 2

Input: n = 4, meetings = [[3,1,3],[1,2,2],[0,3,3]], firstPerson = 3
Output: [0,1,3]

Explanation:

  • 시간 0에 사람 0이 사람 3에게 비밀을 공유합니다.
  • 시간 2에 사람 1과 사람 2는 비밀을 알지 못합니다.
  • 시간 3에 사람 3이 사람 0과 사람 1에게 비밀을 공유합니다.

따라서 모든 회의가 끝난 뒤 사람 0, 1, 3이 비밀을 알게 됩니다.

Example 3

Input: n = 5, meetings = [[3,4,2],[1,2,1],[2,3,1]], firstPerson = 1
Output: [0,1,2,3,4]

Explanation:

  • 시간 0에 사람 0이 사람 1에게 비밀을 공유합니다.
  • 시간 1에 사람 1이 사람 2에게 비밀을 공유하고, 사람 2가 사람 3에게 비밀을 공유합니다(같은 시간대에 비밀이 전달될 수 있습니다).
  • 시간 2에 사람 3이 사람 4에게 비밀을 공유합니다.

따라서 모든 회의가 끝난 뒤 사람 0, 1, 2, 3, 4가 비밀을 알게 됩니다.

Constraints

  • `2 $a[2] $b[2]);

    // Union‑Find data structures. $parent = range(0, $n - 1); $size = array_fill(0, $n, 1);

    // Helper functions. $find = function (int $x) use (&$parent, &$find): int { if ($parent[$x] !== $x) { $parent[$x] = $find($parent[$x]); // Path compression. } return $parent[$x]; };

    $union = function (int $a, int $b) use (&$parent, &$size, $find): void { $ra = $find($a); $rb = $find($b); if ($ra === $rb) return; // Union by size. if ($size[$ra]


## Complexity Analysis  

- **Time Complexity:**  
  회의를 정렬하는 데 `O(m log m)` 시간이 소요되며, 여기서 `m = meetings.length`입니다.  
  각 회의를 처리할 때는 거의 상수에 가까운 amortized union‑find 연산이 수행되므로 `O(m α(n))` 시간이 걸립니다. 여기서 `α`는 역아커만 함수이며 실제로는 상수에 가깝습니다.  

- **Space Complexity:**  
  union‑find 배열과 그룹화된 회의를 저장하기 위해 `O(n + m)`의 추가 공간이 필요합니다.
Back to Blog

관련 글

더 보기 »