https://www.acmicpc.net/problem/2026
๋ฌธ์
์์ฅ์ ์๋๊ป์๋ 1๋ถํฐ N๊น์ง ๋ฒํธ๊ฐ ๋ถ์ N(K ≤ N ≤ 900)๋ช ์ ํ์๋ค ์ค์์ K(1 ≤ K ≤ 62)๋ช ์ ํ์๋ค์ ์ํ์ ๋ณด๋ด๋ ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์์ฅ์ ์๋๊ป์๋ ์ค๊ฐ์ ์ธ์์ด ์ผ์ด๋๋ฉด ์๋๋ฏ๋ก ์ํ์ ๊ฐ ํ์๋ค์ด ๋ชจ๋ ์๋ก ์น๊ตฌ ์ฌ์ด์ด๊ธฐ๋ฅผ ์ํ๋ค. ์์ฅ์ ์๋๊ป์๋ ์ด๋ฌํ ์ผ์ ์ด๋ฒ์ ์กฐ๊ต๋ก ์ฐธ๊ฐํ ๊ณ ์์ด์๊ฒ ์น๊ตฌ ๊ด๊ณ์ ๋ํ ์ ๋ณด๋ฅผ F(1 ≤ F ≤ 5,600)๊ฐ๋ฅผ ์ฃผ์๋ฉฐ K๋ช ์ ์ ๋ฐํ๋ผ๊ณ ๋ถํํ์๋ค.
๊ณ ์ ์กฐ๊ต๋ฅผ ๋์ ์ํ์ ๊ฐ๊ฒ ๋ K๋ช ์ ํ์๋ค์ ๊ฒฐ์ ํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋ ์ธ ์ ์ K, N, F๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ F๊ฐ์ ์ค์๋ ์๋ก ์น๊ตฌ ๊ด๊ณ์ธ ๋ ์ฌ๋์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์น๊ตฌ ๊ด๊ณ๋ ์ํธ์ ์ธ ๊ด๊ณ์ด๋ฏ๋ก 2๋ฒ ํ์์ด 4๋ฒ ํ์์ ์ข์ํ๋ฉด 4๋ฒ ํ์๋ 2๋ฒ ํ์์ ์ข์ํ๋ค. ๊ฐ์ ์น๊ตฌ ๊ด๊ณ๊ฐ ์ฌ๋ฌ ๋ฒ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
๋ง์ฝ K๋ช ์ ์น๊ตฌ ๊ด๊ณ์ธ ํ์๋ค์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค. ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋, K๊ฐ์ ์ค์ ํ์๋ค์ ๋ฒํธ๋ฅผ ์ฆ๊ฐํ๋ ์์๋ก ํ ์ค์ ํ ๊ฐ์ฉ ์ถ๋ ฅํ๋ค. ์ฌ๋ฌ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค๋ฉด ์ฒซ ๋ฒ์งธ ํ์์ ๋ฒํธ๊ฐ ์ ์ผ ์์ ๊ฒ์ ์ถ๋ ฅํ๋ค. ์ฒซ ๋ฒ์งธ ํ์์ ๋ฒํธ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ผ๋ฉด, ๋ ๋ฒ์งธ ํ์์ ๋ฒํธ๊ฐ ์์ ๊ฒฝ์ฐ๋ฅผ ์ถ๋ ฅํ๊ณ , ์ด์ ๊ฐ์ ์์ผ๋ก ์ถ๋ ฅํ๋ค.
ํ์ด
๋ฐฑํธ๋ํน & DFS๋ก ํ์๋ฐ์.โผ๏ธ
์ฐ์ K๋ช ์ ์ ํํด์ผํ๋๋ฐ K๋ช ์ด ๋ชจ๋ ์๋ก์๋ก ์น๊ตฌ์ฌ์ผํ๋ฏ๋ก 1๋ฒ๋ถํฐ N๋ฒ์ ํ์ ์ค ์น๊ตฌ์ ์๊ฐ K-1์ด๋ผ๋ฉด PASS~โผ๏ธ๐ค
๊ทธ๋์ friendsNum ๋ณ์๋ก ๊ฐ ์น๊ตฌ์ ์๋ฅผ ์ ์ฅํด์ฃผ์๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์น๊ตฌ๊ด๊ณ๋ก ์ฐ๊ฒฐ์ด ๋๋ ๊ฒ์ด ์๋๋ผ ์ ํ๋ ํ์๋ค์ด ๋ชจ๋ ์น๊ตฌ ๊ด๊ณ์ฌ์ผํ๋ค๋ ๊ฒ์ด๋ค.
isFriend(int idx) ํจ์๋ idx๋ฒ ํ์๊ณผ ์ง๊ธ๊น์ง ์ ํํ ํ์๋ค์ด ๋ชจ๋ ์น๊ตฌ์ธ์ง ํ์ธํ๋ ํจ์์ด๋ค.
flag ๋ณ์๋ฅผ ์ฌ์ฉํ ์ด์ ๋!
K๋ช ์ ๊ณ ๋ฅด๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ๊ฐ๋ผ๋ฉด, ์ฒซ ๋ฒ์งธ ํ์์ ๋ฒํธ๊ฐ ์ ์ผ ์์ ๊ฒ์ ์ถ๋ ฅํด์ผํ๊ธฐ ๋๋ฌธ์ DFS๊ฐ ์ฑ๊ณต์ผ๋ก ๋๋๋ฉด flag๋ฅผ true๋ก ๋์ด์ ๋ ์ด์ DFS๋ฅผ ์งํํ์ง ์๋๋ก ๋น ์ ธ๋์ฌ ์ ์๊ฒ ํ๊ธฐ ์ํด์ ์ด๋ค.
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_BOJ_2026_์ํ {
static int N, K, F;
static int[][] friends; // ์น๊ตฌ ๊ด๊ณ ์ ์ฅ 1: ์น๊ตฌ, 0 : ์๋
static int[] friendsNum; // i์ ์น๊ตฌ ์
static boolean[] isVisited;
static StringBuilder sb;
static boolean flag = false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
sb = new StringBuilder();
K = Integer.parseInt(stringTokenizer.nextToken());
N = Integer.parseInt(stringTokenizer.nextToken());
F = Integer.parseInt(stringTokenizer.nextToken());
friends = new int[N+1][N+1];
friendsNum = new int[N+1];
isVisited = new boolean[N+1];
for(int i = 0 ; i < F; i++){
stringTokenizer = new StringTokenizer(br.readLine());
int x = Integer.parseInt(stringTokenizer.nextToken());
int y = Integer.parseInt(stringTokenizer.nextToken());
friends[x][y] = 1;
friends[y][x] = 1;
friendsNum[x]++;
friendsNum[y]++;
}
for(int i = 1; i <= N ;i++){
// ์น๊ตฌ์ ์๊ฐ ๋ณธ์ธ ํฌํจ K๋ช
์ด์์ด์ฌ์ผํจ
// K๋ช
๋ฏธ๋ง์ด๋ผ๋ฉด ๋ถ๊ฐ๋ฅํ๊ธฐ๋๋ฌธ!
if(friendsNum[i] < K-1)
continue;
if(flag)
break;
isVisited[i] = true;
DFS(i, 1);
isVisited[i] = false;
}
if(flag)
System.out.print(sb);
else
System.out.println(-1);
}
private static void DFS(int idx, int cnt) {
if(flag)
return;
if(cnt == K){
for(int i = 1; i <= N ; i++){
if(isVisited[i])
sb.append(i).append("\n");
}
flag = true;
return;
}
for(int i = idx+1 ; i <= N ;i++){
if(friends[idx][i] == 1 && isFriend(i)){
isVisited[i] = true;
DFS(i, cnt+1);
isVisited[i] = false;
}
}
}
private static boolean isFriend(int idx) {
for(int i = 1; i <= N; i++){
if(isVisited[i] && friends[idx][i] != 1)
return false;
}
return true;
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค / BOJ 18427] ํจ๊ป ๋ธ๋ก ์๊ธฐ (0) | 2021.09.14 |
---|---|
[๋ฐฑ์ค / BOJ 2109] ์ํ๊ฐ์ฐ (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 20056] ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 17069] ํ์ดํ ์ฎ๊ธฐ๊ธฐ 2 (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 12782] ๋นํธ ์ฐ์ ์ง์ (0) | 2021.09.14 |