์šฐ๊ทœ์ด์ธ์šฐ์œค
Eager To Learn ๐ŸŒŒ
์šฐ๊ทœ์ด์ธ์šฐ์œค
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿก ํ™ˆ
  • ๐Ÿš€ ๊นƒํ—ˆ๋ธŒ
  • โ›… ํƒœ๊ทธ ํด๋ผ์šฐ๋“œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (217)
    • ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm ๊ธฐ๋ฒ• (1)
      • ๋ฐ”ํ‚น๋… (21)
    • ๋ธ”๋กœ๊ทธ ์ด์‚ฌ (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • ์ž๋ฃŒ๊ตฌ์กฐ (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • ๊ฐœ๋ฐœ์„œ์  (15)
      • ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ (1)
      • ์˜ค๋ธŒ์ ํŠธ - ์กฐ์˜ํ˜ธ (7)
      • ์นœ์ ˆํ•œ SQL ํŠœ๋‹ (7)
    • ํšŒ๊ณ  (2)
hELLO ยท Designed By ์ •์ƒ์šฐ.
์šฐ๊ทœ์ด์ธ์šฐ์œค
๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป PS/๋ฐ”ํ‚น๋…

[JAVA] ๋ฐฑ์ค€ 2617๋ฒˆ ใ€G4.๊ตฌ์Šฌ ์ฐพ๊ธฐใ€‘

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป PS/๋ฐ”ํ‚น๋…

[JAVA] ๋ฐฑ์ค€ 2617๋ฒˆ ใ€G4.๊ตฌ์Šฌ ์ฐพ๊ธฐใ€‘

2023. 9. 18. 14:47

๋ฌธ์ œ

 

2617๋ฒˆ: ๊ตฌ์Šฌ ์ฐพ๊ธฐ

๋ชจ์–‘์€ ๊ฐ™์œผ๋‚˜, ๋ฌด๊ฒŒ๊ฐ€ ๋ชจ๋‘ ๋‹ค๋ฅธ N๊ฐœ์˜ ๊ตฌ์Šฌ์ด ์žˆ๋‹ค. N์€ ํ™€์ˆ˜์ด๋ฉฐ, ๊ตฌ์Šฌ์—๋Š” ๋ฒˆํ˜ธ๊ฐ€ 1,2,...,N์œผ๋กœ ๋ถ™์–ด ์žˆ๋‹ค. ์ด ๊ตฌ์Šฌ ์ค‘์—์„œ ๋ฌด๊ฒŒ๊ฐ€ ์ „์ฒด์˜ ์ค‘๊ฐ„์ธ (๋ฌด๊ฒŒ ์ˆœ์„œ๋กœ (N+1)/2๋ฒˆ์งธ) ๊ตฌ์Šฌ์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ

www.acmicpc.net

 

ํ’€์ด

1๏ธโƒฃ bfs์™€ Marble ํด๋ž˜์Šค ์ •์˜๋ฅผ ํ†ตํ•œ ํ’€์ด

๐Ÿ’ก ๋– ์˜ค๋ฅธ Idea

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌธ์ œ์— ๊ฑฐ์˜ ์ฃผ์–ด์ง€๋‹ค ์‹ถ์ด ๋‚˜์™€์žˆ์—ˆ๋‹ค.

๊ตฌ์Šฌ์ด ์ด 5๊ฐœ์ผ๋•Œ๋Š” ํŠน์ • ๊ตฌ์Šฌ๋ณด๋‹ค ๊ฐ€๋ฒผ์šด๊ฒŒ 3๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ์ค‘๊ฐ„์ด ๋  ์ˆ˜ ์—†๊ณ 

๋ฌด๊ฑฐ์šด๊ฒŒ 3๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ๋Š” ์ค‘๊ฐ„์ด ๋  ์ˆ˜ ์—†๋‹ค.

์ฒ˜์Œ์—๋Š” N์ด ์ง์ˆ˜๋กœ๋„ ์ฃผ์–ด์ง€๋‚˜ ์‹ถ์–ด์„œ, ์ง์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ์•ฝ๊ฐ„ ๊ธฐ์ค€์ด ๋‹ฌ๋ž์ง€๋งŒ ํ™€์ˆ˜๋กœ๋งŒ ์ฃผ์–ด์ง„๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ

ํŠน์ • ๊ตฌ์Šฌ์ด, ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ€๋ฒผ์šด ๊ตฌ์Šฌ์ด (N+1)/2 ๊ฐœ ์ด์ƒ์ด๊ฑฐ๋‚˜ ๋ฌด๊ฑฐ์šด ๊ตฌ์Šฌ์ด (N+1)/2 ๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ์ ˆ๋Œ€ ์ค‘๊ฐ„์ด ๋  ์ˆ˜ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๊ตฌ์Šฌ๋ผ๋ฆฌ ์—ฐ๊ฒฐ์„ ๋งบ์–ด์ฃผ๊ณ  ํŠน์ • ๊ตฌ์Šฌ๋ณด๋‹ค ๋ฌด๊ฑฐ์šด ๊ฐœ์ˆ˜ ํ˜น์€ ๊ฐ€๋ฒผ์šด ๊ฐœ์ˆ˜๋ฅผ bfs๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

 

public class Main {
    static int N;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        List<Marble> marbles = new ArrayList<>();
        
        // ๊ฐ ๊ตฌ์Šฌ๋งˆ๋‹ค ๋ฌด๊ฑฐ์šด ํ˜น์€ ๊ฐ€๋ฒผ์šด ๊ตฌ์Šฌ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก Marble ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
        for (int i = 0; i < N; i++) {
            marbles.add(new Marble(i));
        }

        for (int i = 0; i < M; i++) {
            input = br.readLine().split(" ");
            Marble big = marbles.get(Integer.parseInt(input[0]) - 1);
            Marble small = marbles.get(Integer.parseInt(input[1]) - 1);

			// ํฐ ๊ตฌ์Šฌ์˜ ์ž‘์€ ๊ตฌ์Šฌ ๋ชจ์Œ์—๋Š” ์ž‘์€ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€
            big.smallMarbles.add(small);
            // ์ž‘์€ ๊ตฌ์Šฌ์˜ ํฐ ๊ตฌ์Šฌ ๋ชจ์Œ์—๋Š” ํฐ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€
            small.bigMarbles.add(big);
        }

        int ans = 0;
        
        for (int i = 0; i < N; i++) {
        	
            // ๊ฐ ๊ตฌ์Šฌ ๋ณ„๋กœ ๋ฌด๊ฑฐ์šด ๊ฐœ์ˆ˜ ํ˜น์€ ๊ฐ€๋ฒผ์šด ๊ฐœ์ˆ˜๋ฅผ ์ฒดํฌํ•ด์ค€๋‹ค.
            Marble marble = marbles.get(i);
            if (getCntOfBigger(marble) >= (N + 1) / 2) {
                ans++;
                continue;
            }

            if (getCntOfSmaller(marble) >= ((N + 1) / 2)) {
                ans++;
            }
        }

        System.out.println(ans);
    }

	// bfs ๋ฅผ ์ด์šฉ
    private static int getCntOfBigger(Marble node) {
        int cnt = 0;
        Queue<Marble> q = new LinkedList<>();
        boolean[] checked = new boolean[N];
        q.offer(node);
        checked[node.idx] = true;
        while (!q.isEmpty()) {
            Marble poll = q.poll();
            for (Marble bigMarble : poll.bigMarbles) {
                if (!checked[bigMarble.idx]) {
                    q.offer(bigMarble);
                    checked[bigMarble.idx] = true;
                    cnt++;
                }
            }
        }
        return cnt;
    }

    private static int getCntOfSmaller(Marble node) {
        int cnt = 0;
        Queue<Marble> q = new LinkedList<>();
        boolean[] checked = new boolean[N];
        q.offer(node);
        checked[node.idx] = true;
        while (!q.isEmpty()) {
            Marble poll = q.poll();
            for (Marble smallMarble : poll.smallMarbles) {
                if (!checked[smallMarble.idx]) {
                    q.offer(smallMarble);
                    checked[smallMarble.idx] = true;
                    cnt++;
                }
            }
        }
        return cnt;
    }

    static class Marble {
        int idx;

        List<Marble> bigMarbles = new ArrayList<>();
        List<Marble> smallMarbles = new ArrayList<>();

        public Marble(int idx) {
            this.idx = idx;
        }
    }
}

 

๊ฒฐ๊ณผ

 

 

2๏ธโƒฃ ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ

๐Ÿ’ก ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•˜์—ฌ ๋„์ „ํ•ด๋ณด์•˜๋‹ค.

๊ตฌ์Šฌ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 100๊ฐœ๋กœ 3์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถฉ๋ถ„ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ํŒ๋‹จํ•˜์˜€๋‹ค.

ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ํžŒํŠธ๋กœ์„œ ์ž˜ ์บ์น˜ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด์„œ ๊ตฌ์Šฌ์ด ํฐ ๊ด€๊ณ„ ๋ผ๋ฆฌ๋งŒ ์—ฐ๊ฒฐํ•˜๋Š” ๊ทธ๋ž˜ํ”„์™€ ๊ตฌ์Šฌ์ด ์ž‘์€ ๊ฒฝ์šฐ ์—ฐ๊ฒฐํ•˜๋Š” ๊ทธ๋ž˜ํ”„ 2๊ฐœ๋ฅผ ์ค€๋น„ํ•ด์„œ ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์ด๋‚˜ MAX ๊ฐ’์ด ์•„๋‹ˆ๋ผ๋ฉด ์–ด์ฐŒ๋๋“  ์—ฐ๊ฒฐ์ด ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ

์นด์šดํŒ…์„ํ•ด์ค˜์„œ ๊ฐœ์ˆ˜๊ฐ€ (N+1)/2 ์ด์ƒ์ธ์ง€ ์ฒดํฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
public class Main {
    static int N;
    static final int MAX = 100;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        int[][] smalls = new int[N][N];
        int[][] bigs = new int[N][N];
        
        for (int r = 0; r < N; r++) {
            for (int c = 0; c < N; c++) {
                if (r != c) {
                    smalls[r][c] = MAX;
                    bigs[r][c] = MAX;
                }
            }
        }


        for (int i = 0; i < M; i++) {
            input = br.readLine().split(" ");
            int big = Integer.parseInt(input[0]) - 1;
            int small = Integer.parseInt(input[1]) - 1;
			
            // ์ž‘์€ ๊ด€๊ณ„ ๊ทธ๋ž˜ํ”„
            smalls[small][big] = 1;
            
            // ํฐ ๊ด€๊ณ„ ๊ทธ๋ž˜ํ”„
            bigs[big][small] = 1;

        }

		//ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ
        for (int m = 0; m < N; m++) {
            for (int u = 0; u < N; u++) {
                for (int v = 0; v < N; v++) {
                    smalls[u][v] = Math.min(smalls[u][v], smalls[u][m] + smalls[m][v]);
                    bigs[u][v] = Math.min(bigs[u][v], bigs[u][m] + bigs[m][v]);
                }
            }
        }

        int ans = 0;
        for (int i = 0; i < N; i++) {
            int cntOfSmall = getCount(smalls, i);
            if (cntOfSmall >= (N + 1) / 2) {
                ans++;
                continue;
            }

            int cntOfBig = getCount(bigs, i);
            if (cntOfBig >= (N + 1) / 2) {
                ans++;
            }
        }
        System.out.println(ans);

    }

    private static int getCount(int[][] graph, int i) {
        int cnt = 0;
        for (int c = 0; c < N; c++) {
            if (graph[i][c] != MAX && graph[i][c] != 0) {
                cnt++;
            }
        }
        return cnt;
    }

}

 

๊ฒฐ๊ณผ

  • ๋ฌธ์ œ
  • ํ’€์ด
  • 1๏ธโƒฃ bfs์™€ Marble ํด๋ž˜์Šค ์ •์˜๋ฅผ ํ†ตํ•œ ํ’€์ด
  • ๊ฒฐ๊ณผ
  • 2๏ธโƒฃ ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ
  • ๊ฒฐ๊ณผ
'๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป PS/๋ฐ”ํ‚น๋…' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [JAVA] ๋ฐฑ์ค€ 5214๋ฒˆ ใ€G2.ํ™˜์Šนใ€‘
  • [JAVA] ๋ฐฑ์ค€ 1043๋ฒˆ ใ€G4.๊ฑฐ์ง“๋งใ€‘
  • [JAVA] ๋ฐฑ์ค€ 1707๋ฒˆ ใ€G4.์ด๋ถ„ ๊ทธ๋ž˜ํ”„ใ€‘
  • [JAVA] ๋ฐฑ์ค€ 2660๋ฒˆ ใ€G5.ํšŒ์žฅ๋ฝ‘๊ธฐใ€‘
์šฐ๊ทœ์ด์ธ์šฐ์œค
์šฐ๊ทœ์ด์ธ์šฐ์œค
๊ฐœ๋ฐœ์ž ๊ฟˆ๋‚˜๋ฌด

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.