๋ฌธ์ œ ํ•ด๊ฒฐ (PS)/์ฝ”ํ…Œ TIL

[Java] ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ํ”Œ๋กœ์ด๋“œ–์›Œ์…œ | ๋ฐฑ์ค€ 11403 ๊ฒฝ๋กœ์ฐพ๊ธฐ

9taetae9 2024. 10. 28. 18:18
728x90

https://www.acmicpc.net/problem/11403

 
๋ฐฑ์ค€ 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 ์‚ฌ์šฉ์— ๋” ์ต์ˆ™ํ•ด์ง€๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค!

728x90