๊ธฐ๋ก๋ฐฉ

BOJ_7507 : ์˜ฌ๋ฆผํ”ฝ ๊ฒŒ์ž„ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_7507 : ์˜ฌ๋ฆผํ”ฝ ๊ฒŒ์ž„

Soom_1n 2023. 2. 7. 17:00

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

7507๋ฒˆ: ์˜ฌ๋ฆผํ”ฝ ๊ฒŒ์ž„

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค "Scenario #i:"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ i๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ฒˆํ˜ธ์ด๋ฉฐ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„์—๋Š” ์ƒ๊ทผ์ด๊ฐ€ ์ฐธ์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๊ธฐ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ฌธ์ œ์—์„œ๋„ ์„ค๋ช…ํ–ˆ์ง€

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • ๋ฌธ์ œ
    • ํ•œ ๊ฒฝ๊ธฐ๊ฐ€ ๋๋‚˜์•ผ ๋‹ค์Œ ๊ฒฝ๊ธฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 
    • ์ข…๋ฃŒ์™€ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ์™„์ „ํžˆ ๊ฐ™์•„๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ณ„, ํ•œ ์‚ฌ๋žŒ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฒฝ๊ธฐ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ํ’€์ด (Greedy)
    • ๊ฒฝ๊ธฐ ์ •๋ณด๋ฅผ ๋‚ ์งœ์™€ ์ข…๋ฃŒ ์‹œ๊ฐ„์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ•œ๋‹ค.
    • ๋‹ค์Œ ๊ฒฝ๊ธฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ์นด์šดํŠธ + 1์„ ํ•œ๋‹ค.
      • ๋‹ค์Œ ๊ฒฝ๊ธฐ๊ฐ€ ๋‹ค์Œ ๋‚ ์งœ์ด๋ฉด, ๋ฌด์กฐ๊ฑด ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ๊ฒฝ๊ธฐ๋กœ ์ด๋™ํ•œ๋‹ค.
      • ๋‹ค์Œ ๊ฒฝ๊ธฐ์˜ ์‹œ์ž‘์ด ํ˜„์žฌ ๊ฒฝ๊ธฐ์˜ ์ข…๋ฃŒ ์‹œ๊ฐ„๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋ฉด, ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๊ธฐ์ด๋ฏ€๋กœ ๋‹ค์Œ ๊ฒฝ๊ธฐ๋กœ ์ด๋™ํ•œ๋‹ค.
    • ๊ทธ ์™ธ๋Š” ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฒฝ๊ธฐ์ด๋‹ค.
    • ๋งˆ์ง€๋ง‰ ๊ฒฝ๊ธฐ๊นŒ์ง€ ํ™•์ธํ•˜๋ฉด, ์นด์šดํŠธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 1) Test Case
        int n = Integer.parseInt(br.readLine());
        for (int t = 1; t <= n; t++) {
            // 2) Input
            int m = Integer.parseInt(br.readLine());

            Game[] games = new Game[m];

            for (int i = 0; i < m; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                games[i] = new Game(Integer.parseInt(st.nextToken()), st.nextToken(), st.nextToken());
            }

            // 3) Sort
            Arrays.sort(games);

            // 4) Greedy
            int answer = 1;
            Game game = games[0];
            for (int i = 1; i < m; i++) {
                if (game.day != games[i].day || game.end.compareTo(games[i].start) <= 0) {
                    game = games[i];
                    answer++;
                }
            }

            // 5) Output
            sb.append(String.format("Scenario #%d:\n%d\n\n", t, answer));
//            print(games, dp);
        }
        System.out.println(sb);
    }

    private static class Game implements Comparable<Game> {
        int day;
        String start;
        String end;

        public Game(int day, String start, String end) {
            this.day = day;
            this.start = start;
            this.end = end;
        }

        @Override
        public int compareTo(Game o) {
            if (this.day != o.day)
                return this.day - o.day;
            return this.end.compareTo(o.end);
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • Game์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด, ๋‚ ์งœ, ์‹œ์ž‘์‹œ๊ฐ„, ์ข…๋ฃŒ์‹œ๊ฐ„์„ ์ €์žฅํ•œ๋‹ค.
    • Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•ด, ๋‚ ์งœ์™€ ์ข…๋ฃŒ์‹œ๊ฐ„์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • 1) 2) ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๋งˆ๋‹ค ๊ฒฝ๊ธฐ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ์ •๋ ฌํ•œ๋‹ค.
  • 3) ๋‚ ์งœ, ์ข…๋ฃŒ์‹œ๊ฐ„์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  • 4) ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ด€๋žŒ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๊ธฐ ์ˆ˜ answer๋ฅผ ์นด์šดํŠธํ•œ๋‹ค.
    • ์ •๋ ฌํ•œ ๊ฒฝ๊ธฐ ์ •๋ณด๋ฅผ ์ˆœํšŒํ•œ๋‹ค.
    • ํ˜„์žฌ ๊ฒฝ๊ธฐ( game )์™€ ๋‹ค์Œ ๊ฒฝ๊ธฐ( game[i] )๋ฅผ ๋น„๊ตํ•œ๋‹ค.
      • ๋‚ ์งœ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜, ๋‹ค์Œ ๊ฒฝ๊ธฐ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ํ˜„์žฌ ๊ฒฝ๊ธฐ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด,
        ๋‹ค์Œ ๊ฒฝ๊ธฐ๋ฅผ ํ˜„์žฌ ๊ฒฝ๊ธฐ๋กœ ์ €์žฅํ•˜๊ณ , answer๋ฅผ +1 ํ•œ๋‹ค.
  • 5) ๊ฒฝ๊ธฐ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ ์˜ค๋‹ต ์ฝ”๋“œ : Dynamic Programming ๐Ÿ”ธ

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 1) Test Case
        int n = Integer.parseInt(br.readLine());
        for (int t = 1; t <= n; t++) {
            // 2) Input
            int m = Integer.parseInt(br.readLine());
            int[] dp = new int[m];
            dp[0] = 1;

            Game[] games = new Game[m];

            for (int i = 0; i < m; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                games[i] = new Game(Integer.parseInt(st.nextToken()), st.nextToken(), st.nextToken());
            }

            // 3) Sort
            Arrays.sort(games);

            // 4) dp
            int max = 0;
            for (int i = 1; i < m; i++) {
                dp[i] = find_Before_Game(games, dp, i);
                max = Math.max(max, dp[i]);
            }

            // 5) Output
            sb.append(String.format("Scenario #%d:\n%d\n\n", t, max));
//            print(games, dp);
        }
        System.out.println(sb);
    }

    private static int find_Before_Game(Game[] games, int[] dp, int now) {
        for (int i = now - 1; i >= 0; i--) {
            if (games[now].day > games[i].day ||
                    games[now].start.compareTo(games[i].end) >= 0) {
                return dp[i] + 1;
            }
        }
        return 1;
    }


    private static class Game implements Comparable<Game> {
        int day;
        String start;
        String end;

        public Game(int day, String start, String end) {
            this.day = day;
            this.start = start;
            this.end = end;
        }

        @Override
        public int compareTo(Game o) {
            if (this.day != o.day)
                return this.day - o.day;
            return this.start.compareTo(o.start);
        }
    }

    private static void print(Game[] games, int[] dp) {
        System.out.println("\n=============================\n");
        System.out.println("\n# n : day\tstart\tend \tdp");
        for (int i = 0; i < games.length; i++) {
            System.out.printf("# %d : %d \t%s\t%s\t%d\n",
                    i, games[i].day, games[i].start, games[i].end, dp[i]);
        }
        System.out.println("\n=============================\n");
    }
}
  • DP๋ฅผ ์ด์šฉํ•œ ํ’€์ด๋‹ค.
  • ๊ฐ ๊ฒฝ๊ธฐ์˜ ์ธ๋ฑ์Šค์™€ ๋งค์นญ๋˜๋Š” dp ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
  • ํ•ด๋‹น ๊ฒฝ๊ธฐ๋ฅผ ํฌํ•จํ•ด ์ตœ๋Œ€๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๊ธฐ ์ˆ˜๋ฅผ ์›์†Œ๋กœ ์ €์žฅํ•œ๋‹ค.
    • ํ˜„์žฌ ๊ฒฝ๊ธฐ ์ด์ „์˜ ๊ฒฝ๊ธฐ ์ •๋ณด๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์ฐพ์œผ๋ฉฐ, ์ด์–ด์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์ด์–ด์„œ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด, ์ฐพ์€ ๊ฒฝ๊ธฐ์˜ ์ธ๋ฑ์Šคdp๊ฐ’ +1์„ ์ €์žฅํ•œ๋‹ค.
    • ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๊ธฐ๊ฐ€ ์—†์œผ๋ฉด 1์„ ์ €์žฅํ•œ๋‹ค.
  • m์ด 50000(5๋งŒ)์œผ๋กœ ์ปค์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • dp๋กœ ์—ด์‹ฌํžˆ ํ’€๊ณ  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋„ 5๋งŒ๊ฐœ ๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ตœ์ข… ์ œ์ถœ์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์„œ ์ขŒ์ ˆํ–ˆ๋‹ค...
    • ์‹ฌ์ง€์–ด ์ž…์ถœ๋ ฅ ๋“ฑ์„ ์ตœ์ ํ™” ํ•ด๋ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€๋‹ค.
    • ํ’€์ด ํฌ์ŠคํŒ…์„ ์ฐพ์•„๋ณด๊ณ  ๊ทธ๋ฆฌ๋””๋กœ ํ’€์ด๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ ๋„ˆ๋ฌด ๊ฐ„๋‹จํ–ˆ๋‹ค.
  • ๋น„๋ก ํ‹€๋ ธ์ง€๋งŒ ๋ฌธ์ œ ๋ถ„์„๊ณผ ์ฝ”๋”ฉ ๊ณ„ํš์„ ์ ์–ด๊ฐ€๋ฉฐ ํ’€์ดํ–ˆ๋‹ค.
  • ํƒœ๊ทธ๊ฐ€ ์—†์–ด์„œ ๊ธฐ์—ฌํ•˜๊ธฐ๋กœ greedy์™€ sort๋ฅผ ๋„ฃ์—ˆ๋”๋‹ˆ ๋ฌธ์ œ์— ํ‘œ์‹œ๋๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋„ ๊ณต์œ ํ–ˆ๋‹ค.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_1992 : ์ฟผ๋“œํŠธ๋ฆฌ  (0) 2023.02.10
BOJ_2312 : ์ˆ˜ ๋ณต์›ํ•˜๊ธฐ  (0) 2023.02.10
BOJ_2630 : ์ƒ‰์ข…์ด ๋งŒ๋“ค๊ธฐ  (0) 2023.02.05
BOJ_7569 : ํ† ๋งˆํ†   (0) 2023.02.03
BOJ_7576 : ํ† ๋งˆํ†   (0) 2023.01.30