문제 링크 : https://www.acmicpc.net/problem/2026
서로 좋아하는 친구들의 목록이 나열될 때 소풍에 보낼 수 있는 K 명의 학생을 출력하는 문제입니다.
예전에 굉장히 많이 틀려서 포기했던 문제인데 다시 푸는데도 굉장히 많은 시도를 하고 맞췄습니다..
제 기준에서 크게 두 가지의 함정이 있었는데 아래에서 설명드리겠습니다.
1. 첫번째로 주의할 점은 싸이클을 찾는 문제가 아니라는 사실입니다.
따라서 일반적인 DFS의 싸이클 검사나 유니온 파인드로는 해결할 수가 없습니다.
결국 백트래킹으로 완전 탐색을 하는데 단순하게 인접 행렬로 그래프를 구현해서 돌리면 O(n^3)으로 시간초과가 됩니다.
2. 그래서 탐색할 필요가 없는 노드를 생략하는게 두번째 핵심입니다.
탐색할 필요가 없는지는 어떻게 아는가?
소풍은 무조건 K 명이 가게 됩니다.
만약 K=4 일 때 1번 노드의 친구가 2번, 3번 밖에 없다면 그들이 모두 친구 관계여도 3이 됩니다.
결국 1번 노드는 탐색할 필요가 없어서 생략할 수 있게 됩니다.
예를 들어 K=62 일 때, 모든 노드가 60명의 친구만 가지고 있는 테스트 케이스가 주어집니다.
모든 노드들은 본인과 친구 60명을 포함해서 최대로 나올 수 있는 친구 관계가 61명이라 소풍에 가는 인원이 나올 수 없습니다.
하지만 불필요하게 모든 노드들을 탐색하고 있어야 하죠.
그래서 저는 indegree 배열을 만들어서 자신과 연결된 노드의 갯수가 몇 개인지 저장했습니다.
1번 노드의 친구가 2, 3 이면 indegree[1] = 2가 됩니다.
만약 indegree가 K-1보다 작은 노드들은 탐색할 필요 없이 생략하게 됩니다.
이렇게 두가지 예외처리를 해주면 됩니다.
'알고리즘 문제 > 백준' 카테고리의 다른 글
백준 1302번. 베스트셀러 (Java) (0) | 2019.01.10 |
---|---|
백준 1057번. 토너먼트 (Java) (0) | 2019.01.09 |
백준 10809번. 알파벳 찾기 (Java) (0) | 2019.01.07 |
백준 8959번. OX퀴즈 (Java) (0) | 2019.01.07 |
백준 2839번. 설탕 배달 (Java) (0) | 2019.01.06 |