[Java] ๊ทธ๋ํ ํ์, ํ๋ก์ด๋–์์ | ๋ฐฑ์ค 11403 ๊ฒฝ๋ก์ฐพ๊ธฐ
https://www.acmicpc.net/problem/11403

์ ๊ทผ ๋ฐฉ์
์ฐ์ ์ ์ i์์ j๋ก ๊ฐ๋ ๊ธธ์ด๊ฐ ์์์ธ ๊ฒฝ๋ก์ ์๋ฏธ๋ฅผ ์ดํดํ๋ ค ํด๋ณด์๋ค.
๊ทธ๋ํ G์์ ์ ์ (i,j)๋ i์์ j๋ก ๊ฐ๋ ๊ฐ์ ์ ์ ๋ฌด๋ฅผ ๋ํ๋ธ๋ค.
๊ทธ๋ํ G์ ์ ์ (i,j)๋ ๋ ธ๋ i์์ ๋ ธ๋ j๋ก ์ง์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์์ด์ผ 1์ด ๋๋ ๋ฐ๋ฉด,
์ ์ i์์ j๋ก ๊ฐ๋ ๊ธธ์ด๊ฐ ์์์ธ ๊ฒฝ๋ก๋ ๋ ธ๋ i์์ 1๊ฐ ์ด์์ ๊ฐ์ ์ ๊ฑฐ์ณ ๋ ธ๋ j๋ก ๋๋ฌํ ์ ์๋์ง์ ์ฃผ๋ชฉํ๋ค.
๋ ธ๋ 1๊ณผ ๋ ธ๋ 2 ์ฌ์ด์ ์ง์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์์ด๋ ๋ ธ๋ 1 => (๋ ธ๋ x1 => ... => ๋ ธ๋ xn) => ๋ ธ๋ 2 ์ ๊ฐ์ด ์ฐ๊ฒฐ๋ ์ ์๋ค๋ฉด
(๋ ธ๋ 1, ๋ ธ๋ 2)์ 1์ธ ๊ฒฝ์ฐ๊ฐ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ํ G์์ 1์ธ G[i][j]๋ ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๊ณ ์ํ๋ ์ธ์ ํ๋ ฌ์์๋ 1์ด ๋๋ฏ๋ก, ์ถ๊ฐ์ ์ธ ๋ฐฐ์ด์์ด ๊ทธ๋ํ G๋ฅผ ์ ๋ฐ์ดํธํ๋ฉฐ ์ต์ข ๋ต์ ๊ตฌํ ์ ์์ ๊ฒ์ด๋ผ ํ๋จํ๋ค.
์ฐ์ ๊ทธ๋ํ G๋ฅผ ์ํํ๋ฉฐ 1์ผ๋๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ค for๋ฌธ์ด ํ์ํ ๊ฒ์ด๋ค.
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(i -> j ์ฐ๊ฒฐ๋๋์ง){
G[i][j] = 1;
}
}
}
i์์ j 1๊ฐ ์ด์์ ๊ฐ์ ์ ๊ฑฐ์ณ ์ฐ๊ฒฐ์ด ๋๋์ง๋ฅผ ํ๋จํ ์กฐ๊ฑด์ด ํ์ํ๋ค.
๋ ธ๋ 1 => (๋ ธ๋ x1 => ... => ๋ ธ๋ xn) => ๋ ธ๋ 2 ์ธ ์ํฉ์ด ์ฑ๋ฆฝํ๋ ค๋ฉด
์ฐ์ ๋ ธ๋ 1 => (๋ ธ๋ x1 => ... => ๋ ธ๋ xn), (๋ ธ๋1, ๋ ธ๋ xn)์ด 1์ด ๋์ด์ผํ๊ณ ,
(๋ ธ๋ x1 => ... => ๋ ธ๋ xn) => ๋ ธ๋ 2 , (๋ ธ๋ x1, ๋ ธ๋ 2) ๋ํ 1์ด ๋์ด์ผํ๋ค.
๋ฐ๋ผ์, ์์์ ๋ ธ๋ n์ ๊ฑฐ์ณ i์์ j๋ก ์ฐ๊ฒฐ๋๋์ง ํ์ธํ๊ธฐ์ํด G[i][n] == 1 && G[n][j] == 0 ์์ ํ์ธํ๋ฉด ๋ ๊ฒ์ด๋ค.
๊ฐ ๋ ธ๋๋ฅผ ์ฐจ๋ก๋ก ๊ฑฐ์ฒ๊ฐ๋ ๋ ธ๋๋ก ์ ์ ํ ํ ๊ทธ๋ํG์ ๋ํด ์ด์ค for๋ฌธ์ ๋๋ ค์ฃผ๋ฉด ์ต์ข ์ ์ผ๋ก ์ ์ i์์ j๋ก ๊ฐ๋ ๊ธธ์ด๊ฐ ์์์ธ ๊ฒฝ๋ก๊ฐ 1์ธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
for(int n=0; n < N; n++) { //๊ฑฐ์ฒ๊ฐ๋ ๋
ธ๋ n
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(G[i][n] == 1 && G[n][j] == 1){//i->n && n->j => i->j
G[i][j] = 1;
}
}
}
}
์ด๋ ๊ฑฐ์ฒ๊ฐ๋ ๋ ธ๋ n์ ๊ผญ 0๋ถํฐ N-1์์ผ๋ก ํ์ธํ์ง ์์๋ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค. (๊ฐ ๊ฒฝ๋ก๋ ๋ค๋ฅธ ๊ฒฝ๋ก์ ๋ฐ๊ฒฌ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ ๋ฆฝ์ ์ด๊ณ , ์ด์ค for๋ฌธ์ด ๋งค๋ฒ ์ ๋ฐ์ดํธ๋ ๋ชจ๋ ๋ ธ๋ ์ (i,j)์ ๋ํด i->n->j๋ฅผ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ด๋ค)
์ต์ข ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int[][] G;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
G = new int[N][N];
//๊ทธ๋ํ ์ธ์ ํ๋ ฌ
for(int i=0; i < N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j < N; j++){
G[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int n=0; n < N; n++) { //๊ฑฐ์ฒ๊ฐ๋ ๋
ธ๋ n
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(G[i][n] == 1 && G[n][j] == 1){//i->n && n->j => i->j
G[i][j] = 1;
}
}
}
}
for(int[] g : G){
for(int r : g){
System.out.print(r+" ");
}
System.out.println();
}
}
}
3์ค for๋ฌธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋ : O(n^3)
์ต์ ํ๋ฅผ ์ํค๊ธฐ ์ํด ์๋์ ๊ฐ์ด i->n์ด 1์ด ์๋๋ฉด j ๋ฃจํ๋ฅผ ๋์ง ์๊ฒ ์์ ํด๋ณด์๋๋ฐ ํฐ ์ฐจ์ด๋ ์์๋ค.
for(int n=0; n < N; n++) { //๊ฑฐ์ฒ๊ฐ๋ ๋
ธ๋ n
for (int i = 0; i < N; i++) {
if(G[i][n] == 1) { //i->n ์ด 1์ด ์๋๋ฉด skip
for (int j = 0; j < N; j++) {
if (G[i][j] == 0 && G[n][j] == 1) {// i->j ์ด ์ด๋ฏธ 1์ด๋ฉด skip, n->j์ด 1์ด๋ฉด i->j ๋ 1
G[i][j] = 1;
}
}
}
}
}
์ถ๋ ฅ ๋ถ๋ถ์ StringBuilder๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ์ ๋ชจ์์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์์ ํด๋ณด๋ ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ ์ ์๋ค๋ ๊ฒ์ ํ์ธํ๋ค. System.out ์ I/O ์์ ์ด๊ธฐ ๋๋ฌธ์ StringBuilder๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋ํ IO ์์ ์ ์ค์ด๊ณ , String ๋ฌธ์์ด ๊ฒฐํฉ์ ์ค์ฌ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ๋ ๊ฐ๋ฅํ๋ค. (๋ฉ๋ชจ๋ฆฌ : 20076KB -> 15996KB, ์๊ฐ : 316ms -> 152ms)
StringBuilder sb = new StringBuilder();
for(int[] g : G){
for(int r : g){
sb.append(r).append(" ");
}
sb.append("\n");
}
System.out.print(sb);
๋๋ ์
์์ผ๋ก StringBuilder ์ฌ์ฉ์ ๋ ์ต์ํด์ง๋๋ก ๋ ธ๋ ฅํด์ผ๊ฒ ๋ค!