๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿ—‚๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(Java)

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ๋Œ€์ถฉ ๋งŒ๋“  ์žํŒ

by ์‚๋šค์˜ค๋ฆฌ 2025. 10. 20.

๋ฌธ์ œ ์„ค๋ช…

https://school.programmers.co.kr/learn/courses/30/lessons/160586

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

ํœด๋Œ€ํฐ์˜ ์žํŒ์€ ์ปดํ“จํ„ฐ ํ‚ค๋ณด๋“œ ์žํŒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํ•˜๋‚˜์˜ ํ‚ค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๋ฌธ์ž๊ฐ€ ํ• ๋‹น๋œ ๊ฒฝ์šฐ, ๋™์ผํ•œ ํ‚ค๋ฅผ ์—ฐ์†ํ•ด์„œ ๋น ๋ฅด๊ฒŒ ๋ˆ„๋ฅด๋ฉด ํ• ๋‹น๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฌธ์ž๊ฐ€ ๋ฐ”๋€๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 1๋ฒˆ ํ‚ค์— "A", "B", "C" ์ˆœ์„œ๋Œ€๋กœ ๋ฌธ์ž๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค๋ฉด 1๋ฒˆ ํ‚ค๋ฅผ ํ•œ ๋ฒˆ ๋ˆ„๋ฅด๋ฉด "A", ๋‘ ๋ฒˆ ๋ˆ„๋ฅด๋ฉด "B", ์„ธ ๋ฒˆ ๋ˆ„๋ฅด๋ฉด "C"๊ฐ€ ๋˜๋Š” ์‹์ž…๋‹ˆ๋‹ค.

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

์ด ํœด๋Œ€ํฐ ์žํŒ์„ ์ด์šฉํ•ด ํŠน์ • ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•  ๋•Œ, ํ‚ค๋ฅผ ์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผ ๊ทธ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

1๋ฒˆ ํ‚ค๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ• ๋‹น๋œ ๋ฌธ์ž๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ๋‹ด๊ธด ๋ฌธ์ž์—ด๋ฐฐ์—ด keymap๊ณผ ์ž…๋ ฅํ•˜๋ ค๋Š” ๋ฌธ์ž์—ด๋“ค์ด ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด targets๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ‚ค๋ฅผ ์ตœ์†Œ ๋ช‡ ๋ฒˆ์”ฉ ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š”์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

๋‹จ, ๋ชฉํ‘œ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์„ ๋•Œ๋Š” -1์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ ์‚ฌํ•ญ

  • 1 ≤ keymap์˜ ๊ธธ์ด ≤ 100
    • 1 ≤ keymap์˜ ์›์†Œ์˜ ๊ธธ์ด ≤ 100
    • keymap[i]๋Š” i + 1๋ฒˆ ํ‚ค๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ”๋€Œ๋Š” ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด keymap[0] = "ABACD"์ธ ๊ฒฝ์šฐ 1๋ฒˆ ํ‚ค๋ฅผ ํ•œ ๋ฒˆ ๋ˆ„๋ฅด๋ฉด A, ๋‘ ๋ฒˆ ๋ˆ„๋ฅด๋ฉด B, ์„ธ ๋ฒˆ ๋ˆ„๋ฅด๋ฉด A ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
    • keymap์˜ ์›์†Œ์˜ ๊ธธ์ด๋Š” ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • keymap์˜ ์›์†Œ๋Š” ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 1 ≤ targets์˜ ๊ธธ์ด ≤ 100
    • 1 ≤ targets์˜ ์›์†Œ์˜ ๊ธธ์ด ≤ 100
    • targets์˜ ์›์†Œ๋Š” ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

keymap targets result
["ABACD", "BCEFD"] ["ABCD", "AABB"] [9, 4]
["AA"] ["B"] [-1]
["AGZ", "BSSS"] ["ASA", "BGZ"] [4, 6]

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1

  • "ABCD"์˜ ๊ฒฝ์šฐ,
    1๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → A
    2๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → B
    2๋ฒˆ ํ‚ค ๋‘ ๋ฒˆ → C
    1๋ฒˆ ํ‚ค ๋‹ค์„ฏ ๋ฒˆ → D
    ๋”ฐ๋ผ์„œ ์ดํ•ฉ์ธ 9๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • "AABB"์˜ ๊ฒฝ์šฐ,
    1๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → A
    1๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → A
    2๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → B
    2๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → B
    ๋”ฐ๋ผ์„œ ์ดํ•ฉ์ธ 4๋ฅผ ๋‘ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ [9,4]๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #2

  • "B"์˜ ๊ฒฝ์šฐ, 'B'๊ฐ€ ์–ด๋””์—๋„ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— -1์„ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ [-1]์„ return ํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #3

  • "ASA"์˜ ๊ฒฝ์šฐ,
    1๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → A
    2๋ฒˆ ํ‚ค ๋‘ ๋ฒˆ → S
    1๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → A
    ๋”ฐ๋ผ์„œ ์ดํ•ฉ์ธ 4๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • "BGZ"์˜ ๊ฒฝ์šฐ,
    2๋ฒˆ ํ‚ค ํ•œ ๋ฒˆ → B
    1๋ฒˆ ํ‚ค ๋‘ ๋ฒˆ → G
    1๋ฒˆ ํ‚ค ์„ธ ๋ฒˆ → Z
    ๋”ฐ๋ผ์„œ ์ดํ•ฉ์ธ 6์„ ๋‘ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ [4, 6]์„ return ํ•ฉ๋‹ˆ๋‹ค.

 

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

import java.util.*;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        // ๊ฐ ์•ŒํŒŒ๋ฒณ์˜ ์ตœ์†Œ ์ž…๋ ฅ ํšŸ์ˆ˜ ์ €์žฅ (A ~ Z)
        int[] minCount = new int[26];
        // ์ฒ˜์Œ์—๋Š” ๊ฐ€์žฅ ํฐ ๊ฐ’ ์ €์žฅ
        Arrays.fill(minCount, Integer.MAX_VALUE);
        
        // keymap์„ ํ™œ์šฉํ•ด ์ตœ์†Œ ์ž…๋ ฅ ํšŸ์ˆ˜ ํ™•์ธ
        for (String key : keymap) {
            for (int i = 0; i < key.length(); i++) {
                char c = key.charAt(i);
                // ๊ฐ ์•ŒํŒŒ๋ฒณ์˜ ์ธ๋ฑ์Šค ํ™•์ธ
                int idx = c - 'A';
                // ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ ์—ฌ๋Ÿฌ keymap์— ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ตœ์†Œ๊ฐ’์œผ๋กœ ์œ ์ง€
                minCount[idx] = Math.max(1, Math.min(minCount[idx], i + 1));
            }
        }
        
        // ํŽธ์˜๋ฅผ ์œ„ํ•ด targets์˜ ๊ธธ์ด ์ €์žฅ
        int len = targets.length;
        int[] answer = new int[len];
        
        // ๊ฐ target ๋ฌธ์ž์—ด์— ํ•„์š”ํ•œ ์ž…๋ ฅ ํšŸ์ˆ˜ ๊ณ„์‚ฐ
        for (int i = 0; i < len; i++) {
            String s = targets[i];
            int count = 0;
            // ์ž…๋ ฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๋ณ€์ˆ˜ ์ƒ์„ฑ
            boolean possible = true;
            
            for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                int idx = c - 'A';
                
                // ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋ฉด ์–ด๋–ค ํ‚ค์—์„œ๋„ ๋งŒ๋“ค ์ˆ˜ ์—†์Œ
                if (idx < 0 || idx >= 26 || minCount[idx] == Integer.MAX_VALUE) {
                    possible = false;
                    break;
                }
                
                // ๋ฌธ์ž์— ํ•„์š”ํ•œ ์ž…๋ ฅ ํšŸ์ˆ˜ ํ•ฉ์‚ฐ
                count += minCount[idx];
            }
            
            // ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ -1 ์ €์žฅ
            answer[i] = possible ? count : -1;
        }
        
        // ์ •๋‹ต ๋ฐ˜ํ™˜
        return answer;
    }
}

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•œ ๋ฐฉํ–ฅ

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ, ๊ฐ ํƒ€๊ฒŸ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ํ‚ค ์ž…๋ ฅ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ดํ•ดํ–ˆ์œผ๋ฉฐ, ํ•ต์‹ฌ์€ ๋งค๋ฒˆ keymap์„ ์ „๋ถ€ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž๋ณ„ ์ตœ์†Œ ์ž…๋ ฅ ํšŸ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด ๋‘๋Š” ์ „์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

์กฐ๊ฑด์„ ๋ถ„์„ํ•ด ๋ณด๋ฉด, ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ ์—ฌ๋Ÿฌ ํ‚ค๋งต์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์— ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋ˆ„๋ฅด๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ํšŸ์ˆ˜๋Š” “๋“ฑ์žฅ ์œ„์น˜ + 1” ๊ฐ’๋“ค ์ค‘ ์ตœ์†Ÿ๊ฐ’์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•˜๋‹ค. ๋˜ํ•œ ์–ด๋–ค ๋ฌธ์ž๋“  keymap ์–ด๋””์—๋„ ์—†๋‹ค๋ฉด ๊ทธ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ํƒ€๊ฒŸ์€ ์• ์ดˆ์— ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ๋ฅผ -1๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋งŒ ๋‹ค๋ฃจ๋ฏ€๋กœ HashMap ๋Œ€์‹  ๊ธธ์ด 26์งœ๋ฆฌ int[]๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ ํŒ๋‹จํ–ˆ๋‹ค. ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ์ด ํ•ด์‹œ๋ณด๋‹ค ๋น ๋ฅด๊ณ , ๊ณต๊ฐ„๋„ ๊ณ ์ •์ ์ด๋ฉฐ ๋‹จ์ˆœํ•˜๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ Integer.MAX_VALUE๋กœ ์ฑ„์›Œ ๋‘์–ด ์•„์ง ๊ด€์ธก๋˜์ง€ ์•Š์€ ๋ฌธ์ž๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ณ , ๊ด€์ธก๋  ๋•Œ๋งˆ๋‹ค min ๊ฐฑ์‹ ์œผ๋กœ ์ตœ์†Œ ์ž…๋ ฅ ํšŸ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ํ–ˆ๋‹ค.

๋กœ์ง ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋จผ์ € ์ „์ฒ˜๋ฆฌ ๋‹จ๊ณ„์—์„œ ๋ชจ๋“  keymap ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ๋ฌธ์ž c๊ฐ€ i๋ฒˆ์งธ ์œ„์น˜์— ์žˆ์œผ๋ฉด minCount[c-'A'] = min(minCount[c-'A'], i+1)๋กœ ๊ฐฑ์‹ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ targets[i]์— ๋Œ€ํ•ด ๋ฌธ์ž๋ฅผ ์™ผ์ชฝ๋ถ€ํ„ฐ ๋ณด๋ฉฐ minCount์—์„œ ํ•ด๋‹น ๋ฌธ์ž์˜ ์ตœ์†Œ ์ž…๋ ฅ ํšŸ์ˆ˜๋ฅผ ํ•ฉ์‚ฐํ•œ๋‹ค. ์ด๋•Œ ๊ฐ’์ด ์—ฌ์ „ํžˆ Integer.MAX_VALUE๋ผ๋ฉด ํ•ด๋‹น ๋ฌธ์ž๋Š” ์–ด๋–ค ํ‚ค์—์„œ๋„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ์ฆ‰์‹œ ๋ถˆ๊ฐ€๋Šฅ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ธ์šฐ๊ณ  ๊ฒฐ๊ณผ๋ฅผ -1๋กœ ๊ธฐ๋กํ–ˆ๋‹ค. ์ „๋ถ€ ์œ ํšจํ•˜๋‹ค๋ฉด ๋ˆ„์  ํ•ฉ์„ ๊ทธ๋Œ€๋กœ ๋‹ต์— ๋„ฃ์—ˆ๋‹ค.