๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/Coding Test

Kakao 2022 Blind Test - Lv2. ์–‘๊ถ๋Œ€ํšŒ (Java)

by Edlin 2022. 6. 11.

๋ฌธ์ œ ์š”์•ฝ

์–‘๊ถ๋Œ€ํšŒ์—์„œ ๋ผ์ด์–ธ์ด ์šฐ์Šนํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค ์ค‘ ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งžํžŒ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์•„ return,
์—†๋‹ค๋ฉด [-1] return

 

[๋ฌธ์ œ ์„ค๋ช… ๋ฐ ์ œํ•œ ์กฐ๊ฑด] 

  • ์–ดํ”ผ์น˜์™€ ๋ผ์ด์–ธ์ด ์–‘๊ถ๋Œ€ํšŒ ๊ฒฐ์Šน์ „์— ์˜ฌ๋ผ์™”๋‹ค.
  • ๋‹ค์–‘ํ•œ ์„ ์ˆ˜๊ฐ€ ์–‘๊ถ๋Œ€ํšŒ์—์„œ ์šฐ์Šนํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด, ์šด์˜์œ„์›ํšŒ๋Š” ๋ผ์ด์–ธ์—๊ฒŒ ๋ถˆ๋ฆฌํ•˜๋„๋ก ๊ฒฐ์Šน์ „ ๊ทœ์น™์„ ์ •ํ•˜์˜€๋‹ค.
    • k์ ์— ์—ฌ๋Ÿฌ๋ฐœ์„ ๋งž์ถ”์—ˆ๋”๋ผ๋„, k์ ๋งŒ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • k์ ์„ ์–ดํ”ผ์น˜๊ฐ€ a๋ฐœ, ๋ผ์ด์–ธ์ด b๋ฐœ์„ ๋งž์ท„์„ ๊ฒฝ์šฐ, a >= b ์ผ ๊ฒฝ์šฐ์— ์–ดํ”ผ์น˜๊ฐ€ k ์ ์„ ํš๋“ํ•œ๋‹ค.

 

[์ž…์ถœ๋ ฅ]

  1. n: ๊ฐ ์–‘๊ถ ์„ ์ˆ˜๊ฐ€ ํ™”์‚ด์„ ์  ์ˆ˜ ์žˆ๋Š” ์ด ๊ฐœ์ˆ˜ (1 ≤ n ≤ 10)
  2. info: ์–ดํ”ผ์น˜๊ฐ€ ์œ ํ™”์‚ด์˜ ์ •๋ณด (0 ≤ info์˜ ์›์†Œ ≤ n, info์˜ ์›์†Œ ์ดํ•ฉ = n) 
  3. ๋ผ์ด์–ธ์ด ์–ดํ”ผ์น˜๋ฅผ ์ด๊ธธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” [-1] return
  4. ๋ผ์ด์–ธ์ด ์–ดํ”ผ์น˜๋ฅผ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ค‘, ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งžํžŒ ๊ฒฝ์šฐ return
n info result
5 [2,1,1,1,0,0,0,0,0,0,0] [0,2,2,0,1,0,0,0,0,0,0]
  • info์˜ i ๋ฒˆ์งธ ์›์†Œ๋Š” ๊ณผ๋…์˜ 10-i ์ ์„ ๋งžํžŒ ํ™”์‚ด์˜ ๊ฐœ์ˆ˜
  • ์ฆ‰, 0๋ฒˆ์งธ ์›์†Œ์˜ ์ ์ˆ˜๋Š” 10์ 
  • 1๋ฒˆ์งธ ์›์†Œ์˜ ์ ์ˆ˜๋Š” 9์ 

๋ฌธ์ œ ์ ‘๊ทผ 

  • ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(dfs)์™€ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค. 
  • ๋†’์€ ์ ์ˆ˜๋ถ€ํ„ฐ ๋ผ์ด์–ธ์ด ์œ ํ™”์‚ด์˜ ๊ฐœ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ผ์ด์–ธ์ด ๊ฐ€์žฅ ํฐ ์ ์ˆ˜์ฐจ์ด๋กœ ์šฐ์Šนํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งžํžŒ ๊ฒฝ์šฐ๊ฐ€ ์ตœ์ข… return ๋ฉ๋‹ˆ๋‹ค. 
์ž์„ธํ•œ ์ ‘๊ทผ ๋ฒ•์€ ์ฝ”๋“œ์˜ ์ฃผ์„์„ ํ™•์ธํ•˜์„ธ์š” ๐Ÿ™‚

 

// 22. 06. 11. ํ†  - 2022 ์นด์นด์˜ค ๋ธ”๋ผ์ธ๋“œ - Lv.2 - ์–‘๊ถ๋Œ€ํšŒ

public class Solution {
    public static void main(String[] args) {
        solution(5, new int[]{2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0});
    }

    public static int[] solution(int n, int[] info) {
        int[] answer = {};
        dfs(0, n, new int[11], info);
        answer = min_array;
        return answer;
    }


    static int[] min_array = {-1}; // ๋ผ์ด์–ธ์ด ์œ ํ™”์‚ด์˜ ํ•ฉ ์ค‘ ๋ผ์ด์–ธ์˜ ์ ์ˆ˜๊ฐ€ ์–ดํ”ผ์น˜ ์ ์ˆ˜๋ณด๋‹ค ๋‚ฎ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด [-1]
    static int max_score = Integer.MIN_VALUE; // ๋ผ์ด์–ธ์ด ์œ ํ™”์‚ด์˜ ํ•ฉ ์ค‘ ์–ดํ”ผ์น˜ ์ ์ˆ˜๋ณด๋‹ค ๋†’์„ ๊ฒฝ์šฐ์—๋งŒ ๊ฐฑ์‹ 

    /**
     * ๋ผ์ด์–ธ์ด ์–ดํ”ผ์น˜๊ฐ€ ์œ ํ™”์‚ด๋งŒํผ ํ™”์‚ด์„ ์˜๊ณ , ์–ดํ”ผ์น˜๋ณด๋‹ค ์ ์ˆ˜๊ฐ€ ๋†’์€ ๊ฒฝ์šฐ๋“ค ์ค‘ ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งžํžŒ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.
     *
     * @param level: ๋ผ์ด์–ธ์ด ์œ ํ™”์‚ด์˜ ๊ฐœ์ˆ˜
     * @param n: ์–ดํ”ผ์น˜๊ฐ€ ์œ ํ™”์‚ด์˜ ์ด ๊ฐœ์ˆ˜
     * @param scores: ๋ผ์ด์–ธ์ด ์œ ํ™”์‚ด ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ฐฐ์—ด
     * @param info: ์–ดํ”ผ์น˜๊ฐ€ ์œ ํ™”์‚ด ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ฐฐ์—ด
     */
    private static void dfs(int level, int n, int[] scores, int[] info) {
        if (level == n) {
            int total_score = 0; // ๋ผ์ด์–ธ์ด ํš๋“ํ•œ ์ด ์ ์ˆ˜
            int opposite_score = 0; // ์–ดํ”ผ์น˜๊ฐ€ ํš๋“ํ•œ ์ด ์ ์ˆ˜

            for (int i = 0; i <= 10; i++) {
                if (scores[i] > 0 || info[i] > 0) {
                    if (scores[i] > info[i]) total_score += 10 - i;
                    else opposite_score += 10 - i;
                }
            }

            // ๋ผ์ด์–ธ์ด ์–ดํ”ผ์น˜๋ณด๋‹ค ์ ์ˆ˜๋ฅด ๋งŽ์ด ํš๋“ํ–ˆ์„ ๋•Œ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค.
            // ๋ผ์ด์–ธ์ด ์–ดํ”ผ์น˜๋ฅผ ์ด๊ธฐ๋Š” ๊ฒฝ์šฐ ์ค‘ ์ ์ˆ˜ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ๋‚˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
            // ๋ผ์ด์–ธ์ด ์–ดํ”ผ์น˜๋ฅผ ์ด๊ธฐ๋Š” ๊ฒฝ์šฐ ์ค‘ ์ ์ˆ˜ ์ฐจ์ด๊ฐ€ ๋™์ ์ผ ๊ฒฝ์šฐ, ๋” ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋งŽ์ด ๋งžํžˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
            if (total_score > opposite_score && total_score - opposite_score >= max_score) {
                // ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งžํžŒ ๊ฒฝ์šฐ๋ฅผ min_array์— ๋„ฃ๊ธฐ
                max_score = total_score - opposite_score;
                min_array = scores.clone();
            }
            return;
        }

        for (int i = 0; i <= 10; i++) {
            // ๋ผ์ด์–ธ์ด ์–ดํ”ผ์น˜๋ฅผ ์ด๊ธฐ๊ธฐ ์œ„ํ•ด์„œ ๊ฐ™์€ ์ ์ˆ˜๋Œ€์—์„œ ์–ดํ”ผ์น˜๋ณด๋‹ค 1๋ฐœ ๋” ๋งŽ์ด ๋งž์ถ”๋ฉด ๋˜๋Š” ๊ฒƒ์ด์ง€
            // 2๋ฐœ ์ด์ƒ ๋” ๋งŽ์ด ๋งž์ถ˜ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณผ ํ•„์š”๋Š” ์—†๋‹ค.
            // ์ฆ‰, ๊ฐ ์ ์ˆ˜๋Œ€์—์„œ ์–ดํ”ผ์น˜๋ณด๋‹ค 1๋ฐœ ๋” ๋งŽ์ด ๋งž์ถ”์–ด ์ ์ˆ˜๋ฅผ ํš๋“ํ•˜๊ณ 
            // ๋‚˜๋จธ์ง€ ๋‚จ์€ ํšŸ์ˆ˜๋Š” ๋‹ค๋ฅธ ์ ์ˆ˜๋Œ€๋ฅผ ๊ณต๋žตํ•˜๋Š” ๊ฒƒ์ด ๋” ๋†’์€ ์ ์ˆ˜๋ฅผ ํš๋“ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
            if(scores[i] > info[i]) break;

            scores[i]++;
            dfs(level + 1, n, scores, info);
            scores[i]--;
        }
    }
}

 

๋ฌธ์ œ ๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/92342
 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์–‘๊ถ๋Œ€ํšŒ

๋ฌธ์ œ ์„ค๋ช… ์นด์นด์˜ค๋ฐฐ ์–‘๊ถ๋Œ€ํšŒ๊ฐ€ ์—ด๋ ธ์Šต๋‹ˆ๋‹ค. ๋ผ์ด์–ธ์€ ์ €๋ฒˆ ์นด์นด์˜ค๋ฐฐ ์–‘๊ถ๋Œ€ํšŒ ์šฐ์Šน์ž์ด๊ณ  ์ด๋ฒˆ ๋Œ€ํšŒ์—๋„ ๊ฒฐ์Šน์ „๊นŒ์ง€ ์˜ฌ๋ผ์™”์Šต๋‹ˆ๋‹ค. ๊ฒฐ์Šน์ „ ์ƒ๋Œ€๋Š” ์–ดํ”ผ์น˜์ž…๋‹ˆ๋‹ค. ์นด์นด์˜ค๋ฐฐ ์–‘๊ถ๋Œ€ํšŒ ์šด์˜์œ„์›

programmers.co.kr

 

๋Œ“๊ธ€