์ƒˆ์†Œ์‹

๋ฐ˜์‘ํ˜•
Algorithm

๋ฐฑ์ค€ 1068 ํŠธ๋ฆฌ[JAVA]

  • -
๋ฐ˜์‘ํ˜•

๐Ÿ”—๋งํฌ

1068 ํŠธ๋ฆฌ Gold5

โš ๏ธ๋ฌธ์ œ

ํŠธ๋ฆฌ์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ๋ž€, ์ž์‹์˜ ๊ฐœ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ๋งํ•œ๋‹ค.

ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋…ธ๋“œ ํ•˜๋‚˜๋ฅผ ์ง€์šธ ๊ฒƒ์ด๋‹ค. ๊ทธ ๋•Œ, ๋‚จ์€ ํŠธ๋ฆฌ์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋…ธ๋“œ๋ฅผ ์ง€์šฐ๋ฉด ๊ทธ ๋…ธ๋“œ์™€ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์†์ด ํŠธ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

ํ˜„์žฌ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ์ด๋‹ค. (์ดˆ๋ก์ƒ‰ ์ƒ‰์น ๋œ ๋…ธ๋“œ) ์ด๋•Œ, 1๋ฒˆ์„ ์ง€์šฐ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ•œ๋‹ค. ๊ฒ€์ •์ƒ‰์œผ๋กœ ์ƒ‰์น ๋œ ๋…ธ๋“œ๊ฐ€ ํŠธ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ ๋…ธ๋“œ์ด๋‹ค.

์ด์ œ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” 1๊ฐœ์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” 0๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ N-1๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€, ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋งŒ์•ฝ ๋ถ€๋ชจ๊ฐ€ ์—†๋‹ค๋ฉด (๋ฃจํŠธ) -1์ด ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„์—๋Š” ์ง€์šธ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ํŠธ๋ฆฌ์—์„œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ฅผ ์ง€์› ์„ ๋•Œ, ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”๋ถ„์„


์ฒ˜์Œ ๋‚ด์šฉ์„ ๋ดค์„ ๋•Œ, ๊ฐœ๋…์ด ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ๋ž‘ ๋น„์Šทํ•œ ๋А๋‚Œ์ด ์•„๋‹๊นŒ ์‹ถ์–ด์„œ, ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค. ๋จผ์ € ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด์„œ ํ•ด๋‹น ๋ถ€๋ชจ์˜ ์ž์‹ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ›๋Š” ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ์ž์‹์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๋ฆฌํ”„๋…ธ๋“œ์ธ์ง€ ์•„๋‹Œ์ง€ ์ฒดํฌ๋ฅผ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ดํ›„, ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์ง€๋ช…๋˜์—ˆ์„ ๋•Œ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ๋Š๋Š”๋‹ค. ๋˜ํ•œ ๋ถ€๋ชจ๋ฅผ ๋Š์—ˆ์œผ๋‹ˆ ํ•ด๋‹น ๋ถ€๋ชจ์˜ ์ž์‹ ์ˆ˜๋„ -1์„ ๊ธฐ๋กํ•ด์ค€๋‹ค. 

์ด์ œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ, ๋ฆฌํ”„๋…ธ๋“œ์ธ์ง€ ์ฒดํฌ๋ฅผํ•˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ตœ ์ƒ๋‹จ ๋ถ€๋ชจ๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ๋ผ๋ฉด  ๋ชจ๋“  ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์— +1์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


1. ๋ณ€์ˆ˜ ์„ ์–ธ์€ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•˜์˜€๋‹ค. ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” parent๋ฐฐ์—ด, ์ž์‹๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” haveChildNode๋ฐฐ์—ด์„ ์„ ์–ธํ•˜์—ฌ ๋ฆฌํ”„๋…ธ๋“œ์ธ์ง€ ์ฒดํฌํ•˜๋Š”๋ฐ ํ™œ์šฉํ•  ๊ฒƒ์ด๋‹ค.

static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[] parent;
static int[] haveChildNode;
static int N, removeNode, result = 0;

 

2. ๋‹ค์Œ์€ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๋ฉด์„œ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ์ž์‹์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธ ํ•ด์ค€๋‹ค. ๋ฃจํŠธ๋…ธ๋“œ์˜ ์ˆซ์ž -1์ผ ๊ฒฝ์šฐ ๋ฐฐ์—ด์ดˆ๊ณผ๊ฐ€ ๋‚˜๋‹ˆ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

for (int i = 0; i < N; i++) {
    int parentNode = Integer.parseInt(st.nextToken());

    parent[i] = parentNode;

    if (parentNode != -1) {
        haveChildNode[parentNode]++;
    }
}

 

3. ์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋Š์–ด ๋‚ผ ๊ฒƒ์ด๋‹ˆ ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ๊ฐ€์ง„ ์ž์‹์˜ ์ˆ˜๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚ค๊ณ , ๋ถ€๋ชจ์˜ ๊ฐ’์— ์˜๋ฏธ์—†๋Š” ๊ฐ’ -2๋ฅผ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ์ดํ›„ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ฆฌํ”„๋…ธ๋“œ ์ด๋ฉด์„œ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ๊ฐ€ -1์ธ ๊ฒฝ์šฐ(์ตœ์ƒ์œ„ ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ๋…ธ๋“œ, ๋งŒ์•ฝ ๋Š์–ด๋‚ธ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋ผ๋ฉด -2๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค.)์˜ ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋  ๋•Œ, ๊ฒฐ๊ณผ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

removeNode = Integer.parseInt(br.readLine());

if(parent[removeNode] >= 0){
    haveChildNode[parent[removeNode]]--;
}
parent[removeNode] = -2;

for (int i = 0; i < N; i++) {
    if(haveChildNode[i] == 0 && findParent(i) == -1){
        result++;
    }
}

4.๋ถ€๋ชจ๋ฅผ ์ฐพ๋Š” ๋กœ์ง์ด๋‹ค. ์žฌ๊ท€์ ์œผ๋กœ ๋ถ€๋ชจ๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น ์ตœ์ƒ์œ„ ๋ถ€๋ชจ๊ฐ€ -1์ด๊ฑฐ๋‚˜ -2์ผ ๊ฒฝ์šฐ(0๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ) ํ•ด๋‹น ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. -1์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฒƒ์€ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ์ •์ƒ์ ์ธ ๋ฃจํŠธ๋…ธ๋“œ์ธ ๊ฒƒ์ด๋ฉฐ, -2๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ๋Š์–ด์ง„ ๋…ธ๋“œ์ด๋ฏ€๋กœ ์นด์šดํŠธ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

public static int findParent(int node){
    if(node < 0){
        return node;
    }

    return findParent(parent[node]);
}

โœ”์ „์ฒด ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static int[] parent;
    static int[] haveChildNode;
    static int N, removeNode, result = 0;

    public static void main(String[] args) throws IOException {

        N = Integer.parseInt(br.readLine());

        parent = new int[N];
        haveChildNode = new int[N];

        st = new StringTokenizer(br.readLine());

        for (int i = 0; i < N; i++) {
            int parentNode = Integer.parseInt(st.nextToken());

            parent[i] = parentNode;

            if (parentNode != -1) {
                haveChildNode[parentNode]++;
            }
        }

        removeNode = Integer.parseInt(br.readLine());

        if(parent[removeNode] >= 0){
            haveChildNode[parent[removeNode]]--;
        }
        parent[removeNode] = -2;

        for (int i = 0; i < N; i++) {
            if(haveChildNode[i] == 0 && findParent(i) == -1){
                result++;
            }
        }

        System.out.println(result);
    }

    public static int findParent(int node){
        if(node < 0){
            return node;
        }

        return findParent(parent[node]);
    }
}

๐Ÿ˜„๊ฒฐ๊ณผ

์ดˆ๋ฐ˜์— ๋ฃจํ”„ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ญ์ œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋„ ๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ์— ์ž์‹ ์ˆ˜๋ฅผ ๊ฐ์†Œ์‹œ์ผœ์•ผ ํ•˜๋Š”๋ฐ ์‹ ๊ฒฝ์„ ๋ชป์จ์„œ ํ•œ ๋ฒˆ ํ‹€๋ ธ๋‹ค. ๊ทธ๋ž˜๋„ ์ง๊ด€์ ์ธ ๋ฌธ์ œ์—ฌ์„œ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐ ํ–ˆ์ง€๋งŒ, ์•ž์œผ๋กœ ๊ผผ๊ผผํ•˜๊ฒŒ ํ’€์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค. 

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.