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

[Java] ํ”Œ๋กœ์ด๋“œ–์›Œ์…œ | ๋ฐฑ์ค€ 1389 ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ 6๋‹จ๊ณ„ ๋ฒ•์น™

9taetae9 2024. 10. 29. 13:54
728x90

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

 

์ฒซ ์ ‘๊ทผ ๋ฐฉ์‹(์‹คํŒจ)

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ค์—ˆ์ง€๋งŒ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋ง‰๋ง‰ํ•ด ๋ธŒ๋ฃจํŠธํฌ์Šค ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด์•˜๊ณ  ๊ฒฐ๊ณผ๋Š” ์—ญ์‹œ ์‹คํŒจ์˜€๋‹ค. 

๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ์—ˆ๋‹ค. 

1. ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ ์Œ (i, j)์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๋ฉฐ ์—ฐ๊ฒฐ ์ฐพ๊ธฐ
2. searchMin ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ํƒ์ƒ‰
3. ๊ฐ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ ์Œ์— ๋Œ€ํ•ด searchMin ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ค‘๊ฐ„ ๋…ธ๋“œ ์ฐพ๊ธฐ
4. ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ตœ์†Œ๊ฐ’์„ ๊ฐฑ์‹ 

 

์˜ˆ์ œ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋“ฑ์˜ ๋ฌธ์ œ๋กœ ์‹คํŒจํ•˜์˜€๋‹ค.

 

 

๋‹ค์‹œ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ํ•™์Šตํ•˜๊ณ  ํ’€์ดํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.

๋‚ด๊ฐ€ ๋ธŒ๋ฃจํŠธํฌ์Šค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ์„๋•Œ๋„ ๊ฒฐ๊ตญ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์œ ์ € ์Œ์„ ์ด์„ ์ˆ˜ ์žˆ๋Š” ์ค‘๊ฐ„ ์œ ์ €๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์˜€๋‹ค.

=> ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ๋ฐฉ์‹์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•ด์•ผ๋ ์ง€ ์ •ํ™•ํžˆ ๋ชฐ๋ผ ์–ด๋ ค์› ๋˜๊ฒƒ ๊ฐ™๋‹ค.

 

์šฐ์„  ์œ ์ € ์ตœ์  ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” 2์ฐจ์›” ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ๋‹ค. ๋ชจ๋“  ๊ฐ’์„ ์ตœ๋Œ€ ๊ด€๊ณ„์ˆ˜์ธ 5000์œผ๋กœ ์ฑ„์šฐ๊ณ , iํ–‰ i์—ด ์ž๊ธฐ ์ž์‹ ๊ณผ์˜ ๊ด€๊ณ„๋Š” 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

for (int i = 1; i <= N; i++) {
    Arrays.fill(bacon[i], 5000);
    bacon[i][i] = 0;
}

 

๋‹ค์Œ ๋‹จ๊ณ„๋กœ M๊ฐœ์˜ ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ๋ฐ”๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ด€๊ณ„์ด๋ฏ€๋กœ 1๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

๊ด€๊ณ„๊ฐ€ u1 u2 ์ผ ๊ฒฝ์šฐ => u1 ํ–‰ u2์—ด, u2ํ–‰ u1์—ด์„ 1๋กœ ์—…๋ฐ์ดํŠธ

for(int i=0; i < M; i++) {
    st = new StringTokenizer(br.readLine());
    int u1 = Integer.parseInt(st.nextToken());
    int u2 = Integer.parseInt(st.nextToken());
    bacon[u1][u2] = bacon[u2][u1] = 1;
}

 

์ด์ œ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•  ๋‹จ๊ณ„๋‹ค.

๊ฑฐ์ฒ˜๊ฐˆ ์œ ์ €๋ฅผ k๋กœ ํ•˜๊ณ , i ์™€ j ์‚ฌ์ด์˜ ๊ด€๊ณ„๊ฐ€ i ์™€ k ์‚ฌ์ด์˜ ๊ด€๊ณ„ + k ์™€ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ณด๋‹ค ํฌ๋‹ค๋ฉด k๋ฅผ ํ†ตํ•œ ๊ด€๊ณ„๊ฐ€ ๋” ์ž‘์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฏ€๋กœ ์ด๋กœ ์—†๋ฐ์ดํŠธ ํ•œ๋‹ค. (i == j ์ธ ๊ฒฝ์šฐ๋Š” 0์œผ๋กœ ์ €์žฅํ•ด ๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์–‘์ˆ˜๋กœ ์—…๋ฐ์ดํŠธ ๋  ์ˆ˜ ์—†๋‹ค)

for(int k=1; k <=N; k++) {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (bacon[i][j] > bacon[i][k] + bacon[k][j]) {
                bacon[i][j] = bacon[i][k] + bacon[k][j];
            }
        }
    }
}

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ ํ–‰์˜ ํ•ฉ ์ค‘ ์ตœ์†Œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” user๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ์ •๋‹ต์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ฉ์˜ ์ตœ์†Œ๊ฐ’์ด ์—ฌ๋Ÿฌ ๋ช…์ผ ๊ฒฝ์šฐ์—๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๋žŒ์„ ์ถœ๋ ฅํ•œ๋‹ค ํ–ˆ์œผ๋ฏ€๋กœ,

์œ ์ € 1๋ถ€ํ„ฐ ์ˆœํšŒํ•˜์—ฌ min > sum ์ผ ๊ฒฝ์šฐ์—๋งŒ ์œ ์ € ๋ฒˆํ˜ธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํ•ฉ์˜ ์ตœ์†Œ๊ฐ’์ด ๋™์ผํ•œ ์œ ์ €๋„ ๋ฒˆํ˜ธ๊ฐ€ ํฐ ์œ ์ €์ด๋ฏ€๋กœ ๋ฌด์‹œํ•˜๋ฉด ๋œ๋‹ค.

int min = Integer.MAX_VALUE;
int user = 0;
for(int i = 1; i <= N; i++){
    int sum = 0;
    for(int j = 1; j <= N; j++){
        sum += bacon[i][j];
    }
    if(min > sum) {
        min = sum;
        user = i;
    }
}

System.out.println(user);

 

 

๋ฐฐ์šด์  :

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์•„์ง ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋Œ€์ถฉ ์ดํ•ด์„œ๋Š” ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ผ๋„ ๊ณ„์† ํ‹€๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํ•˜๊ฒŒ ๋ฌธ์ œ์™€ ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์„ ์งš๋Š” ๋…ธ๋ ฅ์„ ํ•ด์•ผ๊ฒ ๋‹ค.

i ์™€ j ์‚ฌ์ด์˜ ๋‹จ๊ณ„์™€ (i ์™€ k ์‚ฌ์ด์˜ ๋‹จ๊ณ„ + k ์™€ j์‚ฌ์ด์˜ ๋‹จ๊ณ„), ์–ด์ œ ํ’€์–ด๋ณด์•˜๋˜ ์ •์  i์—์„œ j๋กœ ๊ฐ€๋Š” ๊ธธ์ด๊ฐ€ ์–‘์ˆ˜์ธ ๊ฒฝ๋กœ ๋‘ ๋ฌธ์ œ๋Š” ๊ณตํ†ต์ ์œผ๋กœ ๊ฒฐ๊ตญ ๋ชจ๋“  ๋…ธ๋“œ์™€ ๋…ธ๋“œ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๋” ํ’€์–ด๋ณด๋ฉฐ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋” ํ™•์‹คํ•˜๊ฒŒ ์ดํ•ดํ•ด๋ณด์•„์•ผ๊ฒ ๋‹ค. 

 

728x90