🔗 문제 링크 : https://www.acmicpc.net/problem/1325
문제
해커 김지민은 잘 알려진 어느 회사를 해킹하려고 한다. 이 회사는 N개의 컴퓨터로 이루어져 있다. 김지민은 귀찮기 때문에, 한 번의 해킹으로 여러 개의 컴퓨터를 해킹할 수 있는 컴퓨터를 해킹하려고 한다.
이 회사의 컴퓨터는 신뢰하는 관계와, 신뢰하지 않는 관계로 이루어져 있는데, A가 B를 신뢰하는 경우에는 B를 해킹하면, A도 해킹할 수 있다는 소리다.
이 회사의 컴퓨터의 신뢰하는 관계가 주어졌을 때, 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 출력하는 프로그램을 작성하시오.
입출력 예시
입력
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한다"를 의미한다. 컴퓨터는 1번부터 N번까지 번호가 하나씩 매겨져 있다.
출력
첫째 줄에, 김지민이 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 오름차순으로 출력한다.
풀이
set보다 빠른 삽입과 접근에 유용한 vector로 인접 리스트를 구현하고, 재귀 함수를 이용한 DFS로 문제를 해결했다.
해킹할 수 있는 컴퓨터의 수(cnt)는 재귀함수로부터 반환받는다.
DFS호출 후, count에 최종으로 반환되는 값을 받은 후, 가장 큰 수인지 maxCount(현재까지 가장 큰 수)와 비교하여 maxCount 갱신을 시도한다.
#include <iostream>
#include <vector>
using namespace std;
int N, M;
bool isVisited[10001];
vector<int> graph[10001];
vector<int> results;
int dfs(int number) {
int cnt = 1;
isVisited[number] = true;
for (int neighbor : graph[number]) {
if (!isVisited[neighbor]) {
cnt += dfs(neighbor);
}
}
return cnt;
}
int main() {
ios_base::sync_with_stdio(0);
cin >> N >> M;
for (int i = 0; i < M; i++) {
int n, m;
cin >> n >> m;
graph[m].push_back(n);
}
int maxCount = 0;
for (int i = 0; i <= N; i++) {
if (graph[i].empty()) continue; // ⏱ 이웃 노드에 방문할 간선이 없으면 스킵
fill(isVisited, isVisited + 10001, false);
int count = dfs(i);
if (count > maxCount) {
maxCount = count;
results.clear();
results.push_back(i);
} else if (count == maxCount) {
results.push_back(i);
}
}
for (int result : results) {
cout << result << " ";
}
}
❗ 주의할 점 ❗
- A B를 입력받으면 "A가 B를 신뢰한다" 라는 의미를 가진다. 즉, B를 해킹하면 A도 해킹할 수 있다는 뜻이다.
즉, B -> A 간선을 뜻하기 때문에 방향 그래프를 떠올려야한다.- A가 B를 신뢰한다 는 관계를 인접 리스트에 넣을 때는 graph[B].push_back(A) 이다.
⏱ (소소한) 시간 단축
위 코드의 33번째 줄 if (graph[i].empty()) continue; 부분이 없어도 채점 통과는 가능하다.
하지만 원소가 하나도 없을 graph[]에 대해 DFS함수 호출을 시도하는 게 영.. 찝찝하고 시간도 단축시킬 겸 한 줄 추가했다.
2348 ms 에서 2188 ms로 (미세하게) 절약하였다.
'🐸 Problem Solving > BOJ' 카테고리의 다른 글
[BOJ/C++] 백준 14503번: 로봇 청소기 (0) | 2024.08.27 |
---|---|
[BOJ/C++] 백준 1012번: 유기농 배추 (0) | 2024.08.23 |
[BOJ/C++] 백준 1926번: 그림 (0) | 2024.08.21 |