08
25

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ 

์ฒ˜์Œ์—๋Š” ์ง„์งœ ๋‘ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•ด์„œ ๋น„๊ตํ•˜๋ฉด ๋˜๊ฒ ์ง€๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทผ๋ฐ ์ž…๋ ฅ์ด 10๋งŒ์ด๋ผ ์•„๋งˆ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์œผ๋ฉด ํšจ์œจ์„ฑ ๊ฒ€์‚ฌ์—์„œ ๊ฑธ๋ฆฌ์ง€์•Š์•˜์„๊นŒ..
๋™๋ช…์ด์ธ์ด ์žˆ๋Š” ์ƒํƒœ๋ผ Set์€ ๋ชป์“ฐ๊ณ , ๊ทธ๋ž˜์„œ Map์„ ์ผ๋‹ค.

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        TreeMap<String, Integer> tm = new TreeMap();
        for(String name: participant){
            tm.put(name, tm.getOrDefault(name, 0)+1);
        } // ํŠธ๋ฆฌ๋งต์— ์ €์žฅํ•ด๋‘๊ธฐ -> ๊ตณ์ด TreeMap์ผ ํ•„์š”์—†์Œ
        // ์ด์ œ completion์„ ๋Œ๋ฉด์„œ ์ฒ˜๋ฆฌํ•˜์ž
        for(String name: completion){
            tm.put(name, tm.get(name)-1);
        } // 0์ด๋ฉด ์™„์ฃผํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋  ๊ฒƒ
        
        Iterator<String> keys = tm.keySet().iterator();
        while(keys.hasNext()){
            String key = keys.next();
            if(tm.get(key) != 0){
                answer = key;
                break;
            }
        }
        
        return answer;
    }
}

TreeMap์„ ์“ฐ๊ณ , key๋ฅผ ์ด๋ฆ„, value๋ฅผ ์ธ์›์ˆ˜๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์ •๋ ฌ์ด ํ•„์š”์—†๊ธฐ๋•Œ๋ฌธ์— HashMap์„ ์“ฐ๋Š” ๊ฒŒ ํšจ์œจ์ ์ด์ง€๋งŒ ๊ทธ๋ƒฅ ์ˆ™๋ จ์„ ์œ„ํ•ด TreeMap์„ ์„ ํƒํ–ˆ๋‹ค.

์ดˆ๊ธฐํ™”ํ•  ๋•Œ getOrDefault๋ฅผ ์“ด ์ด์œ ๋Š” value๊ฐ€ ์—†์„ ๋•Œ null ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•จ์ด๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋‹ค ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ๋‚˜์„œ, ์ธ์›์ˆ˜๊ฐ€ 1์ธ key๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋Š” ๊ฒŒ ๋ฌธ์ œ์˜€๋‹ค. ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ keySet์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š”๋ฐ ์ด ๊ฒฝ์šฐ ์กฐํšŒํ•ด์•ผ๋˜๋Š” ๊ฐ’์ด ์—„์ฒญ ๋งŽ๋‹ค๋ฉด entrySet์— ๋น„ํ•ด ์—„์ฒญ ๋Š๋ฆฌ๋‹ค๊ณ  ํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  entrySet์„ ์“ฐ๋ฉด iterator๋ฅผ ์•ˆ์จ๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์ฒ˜๋Ÿผ ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        TreeMap<String, Integer> tm = new TreeMap();
        for(String name: participant){
            tm.put(name, tm.getOrDefault(name, 0)+1);
        } // ํŠธ๋ฆฌ๋งต์— ์ €์žฅํ•ด๋‘๊ธฐ -> ๊ตณ์ด TreeMap์ผ ํ•„์š”์—†์Œ
        // ์ด์ œ completion์„ ๋Œ๋ฉด์„œ ์ฒ˜๋ฆฌํ•˜์ž
        for(String name: completion){
            tm.put(name, tm.get(name)-1);
        } // 0์ด๋ฉด ์™„์ฃผํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋  ๊ฒƒ
        
        for(Map.Entry<String, Integer> item : tm.entrySet()){
            if(item.getValue() != 0){
                answer = item.getKey();
                break;
            }
        }
        
        return answer;
    }
}

# ์ถ”๊ฐ€ ๊ณต๋ถ€

TreeMap ์•Œ์•„๋ณด๊ธฐ

// entrySet()์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ•ญ๋ชฉ ์ˆœํšŒ
for (Map.Entry<String, Integer> entry : tm.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + ": " + value);
}

// ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ํ•ญ๋ชฉ ์ฐพ๊ธฐ
for (Map.Entry<String, Integer> entry : tm.entrySet()) {
    if (entry.getValue() > 2) {
        System.out.println(entry.getKey());
    }
}

// ๋งต ์ˆ˜์ •ํ•˜๊ธฐ
for (Map.Entry<String, Integer> entry : tm.entrySet()) {
    entry.setValue(entry.getValue() * 2);
}

Tree ์‹œ๋ฆฌ์ฆˆ ๋‹ต๊ฒŒ ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๊ณ , SortedMap์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋‹ค.  ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ(๊ธฐ๋ณธ์€ ์˜ค๋ฆ„์ฐจ์ˆœ)์ด๋ฉฐ entrySet์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งต์˜ ๋ชจ๋“  key-value ์Œ์„ `Set<Map.Entry<K,V>>` ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

set์ด add, remove์˜€๋‹ค๋ฉด map์€ put, get, remove(key๋กœ ์‚ญ์ œ, entrySet์—์„œ ์‚ญ์ œ, key-value๋กœ ์‚ญ์ œ)๊ฐ€ ์žˆ๋‹ค.

 

์‚ญ์ œ๋งŒ ์ข€ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

// 1. ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ ์‚ญ์ œ
tm.remove("Apple");

// 2. ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•œ ์‚ญ์ œ
tm.remove("Banana", 2);

์‹ ๊ธฐํ•œ ๊ฑด removeIf๊ฐ€ ์žˆ๋Š”๋ฐ ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค. ๋žŒ๋‹ค์‹์„ ์“ฐ๋Š”๊ฑด๋ฐ ๊ทธ๋ƒฅ ์ด๋Ÿฐ๊ฒŒ ์žˆ๋‹ค ์ •๋„๋งŒ ๊ธฐ์–ตํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

// ์ง์ˆ˜๋งŒ ์ œ๊ฑฐํ•˜๊ธฐ
tm.entrySet().removeIf(entry -> entry.getValue() % 2 == 0);

 

putIfAbsent๋„ ์žˆ์–ด์„œ ์ด๊ฑธ ํ™œ์šฉํ•˜๋ฉด value์— Collection๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

tm.putIfAbsent("A", 1);

๊ธฐ์กด์˜ put์ด ๋ฌด์กฐ๊ฑด ํ‚ค๋ฅผ ๋ฎ์–ด์ผ๋‹ค๋ฉด putIfAbsent๋Š” ํ‚ค๊ฐ€ ์—†์„ ๋•Œ๋งŒ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Collection๊ฐ™์€ ๊ฑธ new๋กœ ๋„ฃ์–ด์ค„ ๋•Œ ์“ฐ๋ฉด ๋˜๊ฒ ๋‹ค.

 

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT