๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿงฉ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿต ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(Java)

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜

by carrot0911 2025. 4. 3.

๋ฌธ์ œ ์„ค๋ช…

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

 

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

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

programmers.co.kr

์ˆ˜๋งŽ์€ ๋งˆ๋ผํ†ค ์„ ์ˆ˜๋“ค์ด ๋งˆ๋ผํ†ค์— ์ฐธ์—ฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹จ ํ•œ ๋ช…์˜ ์„ ์ˆ˜๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ์„ ์ˆ˜๊ฐ€ ๋งˆ๋ผํ†ค์„ ์™„์ฃผํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋งˆ๋ผํ†ค์— ์ฐธ์—ฌํ•œ ์„ ์ˆ˜๋“ค์˜ ์ด๋ฆ„์ด ๋‹ด๊ธด ๋ฐฐ์—ด participant์™€ ์™„์ฃผํ•œ ์„ ์ˆ˜๋“ค์˜ ์ด๋ฆ„์ด ๋‹ด๊ธด ๋ฐฐ์—ด completion์ด ์ฃผ์–ด์งˆ ๋•Œ, ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜์˜ ์ด๋ฆ„์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

  • ๋งˆ๋ผํ†ค ๊ฒฝ๊ธฐ์— ์ฐธ์—ฌํ•œ ์„ ์ˆ˜์˜ ์ˆ˜๋Š” 1๋ช… ์ด์ƒ 100,000๋ช… ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • completion์˜ ๊ธธ์ด๋Š” participant์˜ ๊ธธ์ด๋ณด๋‹ค 1 ์ž‘์Šต๋‹ˆ๋‹ค.
  • ์ฐธ๊ฐ€์ž์˜ ์ด๋ฆ„์€ 1๊ฐœ ์ด์ƒ 20๊ฐœ ์ดํ•˜์˜ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ๊ฐ€์ž ์ค‘์—๋Š” ๋™๋ช…์ด์ธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

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

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

  • "leo"๋Š” ์ฐธ์—ฌ์ž ๋ช…๋‹จ์—๋Š” ์žˆ์ง€๋งŒ, ์™„์ฃผ์ž ๋ช…๋‹จ์—๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์™„์ฃผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

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

  • "vinko"๋Š” ์ฐธ์—ฌ์ž ๋ช…๋‹จ์—๋Š” ์žˆ์ง€๋งŒ, ์™„์ฃผ์ž ๋ช…๋‹จ์—๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์™„์ฃผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

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

  • "mislav"๋Š” ์ฐธ์—ฌ์ž ๋ช…๋‹จ์—๋Š” ๋‘ ๋ช…์ด ์žˆ์ง€๋งŒ, ์™„์ฃผ์ž ๋ช…๋‹จ์—๋Š” ํ•œ ๋ช…๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ช…์€ ์™„์ฃผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

 

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

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        // ์ฐธ๊ฐ€์ž์˜ ์ด๋ฆ„์„ Key๋กœ, ์ด๋ฆ„์˜ ๊ฐœ์ˆ˜๋ฅผ Value๋กœ ์ €์žฅ
        HashMap<String, Integer> map = new HashMap<>();
        
        // ๋ฐ˜๋ณต๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ participant ๋ฐฐ์—ด์„ ์ˆœํšŒ
        for (String p : participant) {
            // ๊ฐ ์ฐธ๊ฐ€์ž์˜ ์ด๋ฆ„์„ HashMap์— ์ €์žฅ
            // getOrDefault ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ด๋ฏธ HashMap์— ์กด์žฌํ•˜๋Š” ์ด๋ฆ„์ด๋ผ๋ฉด ๊ฐ’์„ ์ฆ๊ฐ€
            // ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  +1
            map.put(p, map.getOrDefault(p, 0) + 1);
        }
        
        // ๋ฐ˜๋ณต๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ completion ๋ฐฐ์—ด์„ ์ˆœํšŒ
        for (String c : completion) {
            // ๊ฐ ์™„์ฃผ์ž์˜ ์ด๋ฆ„์˜ Value -1
            map.put(c, map.get(c) -1);
        }
        
        // ๋ฐ˜๋ณต๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ HashMap์„ ์ˆœํšŒ
        for (String key : map.keySet()) {
            // ๋งŒ์•ฝ Value ๊ฐ’์ด 0์ด ์•„๋‹Œ key(์ฐธ๊ฐ€์ž ์ด๋ฆ„)์ด ์žˆ๋Š” ๊ฒฝ์šฐ
            if (map.get(key) != 0) {
                // answer์— Key ๊ฐ’ ์ €์žฅ
                answer = key;
            }
        }
        
        // answer ๋ฐ˜ํ™˜
        return answer;
    }
}

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

  • HashMap์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์—†์–ด์„œ ๋จผ์ € ๊ฐœ๋… ๊ณต๋ถ€๋ฅผ ํ–ˆ๋‹ค.
  • ๊ทธ ๋‹ค์Œ HashMap์— ์ฐธ๊ฐ€์ž์˜ ์ด๋ฆ„์„ Key๋กœ ์ด๋ฆ„์˜ ๊ฐœ์ˆ˜๋ฅผ Value๋กœ ๋„ฃ์—ˆ๋‹ค.
  • ๋‹ค์‹œ ์™„์ฃผ์ž๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ Value ๊ฐ’์„ -1 ํ•ด์ฃผ๊ณ  ์ตœ์ข…์ ์œผ๋กœ Value๊ฐ€ 0์ด ์•„๋‹Œ Key ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.