[Java] ํ๋ก์ด๋โ์์ | ๋ฐฑ์ค 2660 ํ์ฅ๋ฝ๊ธฐ
https://www.acmicpc.net/problem/2660

์ ๊ทผ ๋ฐฉ์ :
"๋ค๋ฅธ ํ์๋ค๊ณผ ๊ฐ๊น์ฐ ์ ๋", "์น๊ตฌ์ ์น๊ตฌ" ๋ฑ์ ๋ถ๋ถ์ ์ฝ์์ ๋, ์คํฐ๋ 1, 2์ผ์ฐจ์ ํ์ตํ๋ ํ๋ก์ด๋์์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด์ผ ๋๋ค๋ ๊ฒ์ด ๋ฐ๋ก ๋๊ปด์ก๋ค.
์ด๋ ํ์์ ์ ์๊ฐ n์ ์ด๋ฉด ๋ค๋ฅธ๋ชจ๋ ํ์์ด ์น๊ตฌ์ด๊ฑฐ๋, ... , [์น๊ตฌ์]*(n-1) ์น๊ตฌ์์ ๋งํ๋ค๊ณ ์ดํดํ๊ณ , ์ฆ n์ ์ด๋ฉด ์ต์ ์ ๊ด๊ณ๋ฅผ ๊ตฌํ์ ๋ ํด๋น ํ์์ผ๋ก ๋ถํฐ ๊ฐ์ฅ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ํ์์ n-1๊ฐ์ ๋ค๋ฅธ ์น๊ตฌ(๋ ธ๋๋ค)์ ๊ฑฐ์ณ์ ์ฐ๊ฒฐ๋๋ค๋ ์๋ฏธ๋ก ํด์ํ๋ค.
๊ฐ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ค๋ก์ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค,
๊ฐ ๋ ธ๋์์ ๊ฐ์ฅ ๋ฉ๋ฆฌ ๋จ์ด์ ธ์๋ ๋ ธ๋์์ ๊ฐ์ ์๊ฐ ๊ทธ ๋ ธ๋์ ์ ์๊ฐ ๋๋ค.
์ด๋ ๊ฒ ๋ฌธ์ ๋ฅผ ํด์ํ๋ ๋ฐฑ์ค 1389 ์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น๊ณผ ๊ฐ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ค๋ก์ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ณผ์ ๊น์ง ์์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ๋๋ค.
๋ค๋ฅธ ์ ์ ๋ฐฑ์ค 1389 ์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น์์๋ ํด๋น ๋ ธ๋์ ๋ค๋ฅธ ๋ ธ๋๋ค๊ณผ์ ์ด ๊ฑฐ๋ฆฌ๋ฅผ ํฉํ๋ค๋ฉด, ์ด๋ฒ์ ๊ฑฐ๋ฆฌ๋ค์ค ์ต๋๊ฐ์ ๊ทธ ๋ ธ๋์ ์ ์๋ก ์ ํ๊ณ , ์ ์๊ฐ ๊ฐ์ฅ ๋ฎ์ ๋ ธ๋๋ค์ ๊ตฌํ๋ค๋ ๊ฒ ๋ฐ์ ์๋ค.
์ฐ์ friend ๋ฐฐ์ด์ ์ ์ธํ๊ณ ์ต์ ์ ๊ฒฝ์ฐ๋ก ๋ฐฐ์ด ๊ฐ์ ์ด๊ธฐํ ์์ผฐ๋ค. ๋ฌธ์ ์์ ํ์์ ์๊ฐ 50๋ช ์ด ์ต๋๋ผ๊ณ ํ์์ผ๋ฏ๋ก ์ต๋ 49๊ฐ์ ๊ฐ์ ์ ๊ฑฐ์น ์ ์์ด 49๋ก ๋ชจ๋ ๊ฐ์ ์ด๊ธฐํ์์ผฐ๋ค. ์ฌ๊ธฐ์ ์ฒ์ ์ ์ถํ ๋ ์คํจ ์์ธ์ด ๋๋ ๋ถ๋ถ์ด ๋ฐ์ํ๋๋ฐ, friend[i][i], ์ฆ ์๊ธฐ ์์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ 0์ผ๋ก ๋์ง ์์ ์ดํ ํ๋ก์ด๋์์ ์ ์ ์ฉํ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ์ง ์์๋ค.
friend = new int[N + 1][N + 1];
for(int i=1; i<=N; i++){
Arrays.fill(friend[i], 49);
friend[i][i] = 0;
}
์ง์ ์ฐ๊ฒฐ๋ ๊ด๊ณ๋ค 1๋ก ์ ๋ฐ์ดํธ
while (true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int u1 = Integer.parseInt(st.nextToken());
int u2 = Integer.parseInt(st.nextToken());
if (u1 == -1 && u2 == -1) break;
friend[u1][u2] = friend[u2][u1] = 1;
}
ํ๋ก์ด๋์์ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (friend[i][j] > friend[i][k] + friend[k][j] ) {
friend[i][j] = friend[i][k] + friend[k][j];
}
}
}
}
์ด๋ถ๋ถ๊น์ง ์์ ๋ ๋ฐฐ์ด friend์ 1ํ๋ถํฐ nํ์๋ ๊ฐ๊ฐ ํ์๋ฒํธ 1๊ณผ ๋ค๋ฅธ ํ์๋ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ค ~ ํ์๋ฒํธ n๊ณผ ๋ค๋ฅธ ํ์๋ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ค์ ์ต์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ค์ด์์ ๊ฒ์ด๋ค.
์ด์ ๊ฐ ํ์ ๋ฒํธ์ ์ ์๋ฅผ ์ ํด์ฃผ๊ธฐ ์ํด ๊ฐ ํ์์ ๊ฐ์ฅ ํฐ(๊ฑฐ๋ฆฌ๊ฐ ๋จผ) ์ ์๋ฅผ ์ฐพ์ ๊ทธ๊ฒ์ ๊ทธ ํ์ ๋ฒํธ์ ์ ์๋ก ์ง์ ํ๋ค.
int[] userScore = new int[N + 1];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
userScore[i] = Math.max(friend[i][j], userScore[i]);
}
}
๊ทธ๋ ๊ฒ ๊ตฌํ ํ์ ๋ฒํธ์ ์ ์๋ค ์ค ๊ฐ์ฅ ๋ฎ์ ์ ์๋ค ์ค ๊ฐ์ฅ ์์ ์ ์๋ฅผ ๊ตฌํ์๋ค. ์ง๊ธ ์๊ฐํด๋ณด๋ ์ด ๋ถ๋ถ์ ํ์ ๋ฒํธ์ ์ ์๋ฅผ ์ ํ๋ ๊ณผ์ ๊ณผ ํฉ์น๋ฉด ๋ ๊ฐ๋จํด์ง ์ ์๊ฒ ๋ค. (min = Math.min(userScore[i],min)) ์ด ๋ถ๋ถ์ ํ์ ๋ฒํธ i์ for(int j =1; j<=N; j++) ๋ฃจํ๊ฐ ๋๋ ๋ ๋ง๋ค ๋ค์ ํ์๋ฒํธ๋ก ๋์ด๊ฐ๊ธฐ์ ์ต์ ์ ์๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด ๋๊ฒ ๋ค.)
int min = 49;
for (int i = 1; i <= N; i++) {
min = Math.min(userScore[i], min);
}
System.out.print(min + " ");
๊ทธ๋ค์ ์ต์ ์ ์๋ฅผ ๊ฐ์ง ํ์ ์๋ฅผ ๊ตฌํ์๊ณ
int cnt = 0;
for (int i = 1; i <= N; i++) {
if (userScore[i] == min) cnt++;
}
System.out.println(cnt);
๊ทธ ์ต์ ์ ์์ ํด๋น ๋๋ ํ์๋ฒํธ๋ฅผ ์ถ๋ ฅํด ์ฃผ์๋ค.
for (int i = 1; i <= N; i++) {
if (min == userScore[i]) System.out.print(i + " ");
}
๋๋์ :
๊ฐ์ ์ ํ์ธ ํ๋ก์ด๋์์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ 3์ผ์งธ ํธ๋ ์ฒ์ ํ๋ก์ด๋์์ ๋ฌธ์ ๋ฅผ ํ์์ ๋๋ณด๋ค ๋ ์ต์ํด์ง ๋๋์ด์ฌ์ ์ข์๊ณ , ์์ผ๋ก ๋ ์ต์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ณ ๋ฏผ์ ํด๋ณด์์ผ๊ฒ ๋ค.