๐Ÿƒ๐Ÿปโ€โ™€๏ธ[์ปค๋ฎค๋Ÿฌ๋‹/1๊ธฐ] 1์ฃผ์ฐจB - ํ•ด์‹œ(Hash)

๐ŸŽฏ1์ฃผ์ฐจB "์œ„์žฅ"

๐ŸŽƒ๋ฌธ์ œ์„ค๋ช…

๐Ÿ•ต๐Ÿฟ์ŠคํŒŒ์ด๋“ค์€ ๋งค์ผ ๋‹ค๋ฅธ ์˜ท์„ ์กฐํ•ฉํ•˜์—ฌ ์ž…์–ด ์ž์‹ ์„ ์œ„์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ŠคํŒŒ์ด๊ฐ€ ๊ฐ€์ง„ ์˜ท์ด ์•„๋ž˜์™€ ๊ฐ™๊ณ  ์˜ค๋Š˜ ์ŠคํŒŒ์ด๊ฐ€ ๋™๊ทธ๋ž€ ์•ˆ๊ฒฝ, ๊ธด ์ฝ”ํŠธ, ํŒŒ๋ž€์ƒ‰ ํ‹ฐ์…”์ธ ๋ฅผ ์ž…์—ˆ๋‹ค๋ฉด ๋‹ค์Œ๋‚ ์€ ์ฒญ๋ฐ”์ง€๋ฅผ ์ถ”๊ฐ€๋กœ ์ž…๊ฑฐ๋‚˜ ๋™๊ทธ๋ž€ ์•ˆ๊ฒฝ ๋Œ€์‹  ๊ฒ€์ • ์„ ๊ธ€๋ผ์Šค๋ฅผ ์ฐฉ์šฉํ•˜๊ฑฐ๋‚˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ข…๋ฅ˜์ด๋ฆ„
์–ผ๊ตด๋™๊ทธ๋ž€ ์•ˆ๊ฒฝ, ๊ฒ€์ • ์„ ๊ธ€๋ผ์Šค
์ƒ์˜ํŒŒ๋ž€์ƒ‰ ํ‹ฐ์…”์ธ 
ํ•˜์˜์ฒญ๋ฐ”์ง€
๊ฒ‰์˜ท๊ธด ์ฝ”ํŠธ

์ŠคํŒŒ์ด๊ฐ€ ๊ฐ€์ง„ ์˜์ƒ๋“ค์ด ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด clothes๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์„œ๋กœ ๋‹ค๋ฅธ ์˜ท์˜ ์กฐํ•ฉ์˜ ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

๐Ÿ”’์ œํ•œ์‚ฌํ•ญ

  • clothes์˜ ๊ฐ ํ–‰์€ [์˜์ƒ์˜ ์ด๋ฆ„, ์˜์ƒ์˜ ์ข…๋ฅ˜]๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ŠคํŒŒ์ด๊ฐ€ ๊ฐ€์ง„ ์˜์ƒ์˜ ์ˆ˜๋Š” 1๊ฐœ ์ด์ƒ 30๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์˜์ƒ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • clothes์˜ ๋ชจ๋“  ์›์†Œ๋Š” ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 20 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ด๊ณ  ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž ๋˜๋Š” '_' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ŠคํŒŒ์ด๋Š” ํ•˜๋ฃจ์— ์ตœ์†Œ ํ•œ ๊ฐœ์˜ ์˜์ƒ์€ ์ž…์Šต๋‹ˆ๋‹ค.

๐Ÿ’พ์ž…์ถœ๋ ฅ ์˜ˆ

clothesreturn
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]5
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]]3

์˜ˆ์ œ #1
headgear์— ํ•ด๋‹นํ•˜๋Š” ์˜์ƒ์ด yellow_hat, green_turban์ด๊ณ  eyewear์— ํ•ด๋‹นํ•˜๋Š” ์˜์ƒ์ด blue_sunglasses์ด๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด 5๊ฐœ์˜ ์กฐํ•ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses

์˜ˆ์ œ #2
face์— ํ•ด๋‹นํ•˜๋Š” ์˜์ƒ์ด crow_mask, blue_sunglasses, smoky_makeup์ด๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐœ์˜ ์กฐํ•ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

1. crow_mask
2. blue_sunglasses
3. smoky_makeup


๐ŸŒŸ๋ฌธ์ œ ์ดํ•ด ๋ฐ ํ’€์ด๊ณ„ํš

โœ๏ธ์ปค๋ฎค๋Ÿฌ๋‹ ์ด์ „์— ํ•œ๋ฒˆ ํ’€์–ด๋ณธ ๊ธฐ์–ต์ด ์žˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์ƒ๊ฐ์—†์ด ๊ฐ ์ข…๋ฅ˜์˜ ๋ชจ๋“  ์˜์ƒ์„ String ๋ฐฐ์—ด๋กœ ์ €์žฅํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ์ด์ค‘ ํ•ด์‰ฌ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ HashMap<String, ArrayList<String>> ํ•ด์‰ฌ๋งต ์•ˆ์— ArrayList๋กœ ๋ชจ๋“  ์˜์ƒ์„ ์ €์žฅํ•˜์—ฌ ํ’€์—ˆ๋‹ค.
โœ๏ธํ•˜์ง€๋งŒ, ์ด๋ฒˆ์— ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ’€๋ฉด์„œ ๊ตณ์ด String๋ฐฐ์—ด๋กœ ๋ชจ๋“  ์˜์ƒ์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  HashMap<String, Integer>๋กœ ๊ฐ ์ข…๋ฅ˜๋ณ„ ์˜์ƒ ๊ฐœ์ˆ˜๋งŒ ์•Œ๋ฉด ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜๋‹ค.
โœ๏ธ์ด ์˜์ƒ์˜ ์กฐํ•ฉ์€ *= (์ข…๋ฅ˜๋ณ„ ์˜์ƒ ๊ฐœ์ˆ˜ + 1(์ž…์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)) ๋กœ ์ด ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ ๋’ค, - 1(์•Œ๋ชธ์ธ ๊ฒฝ์šฐ)๋ฅผ ๋นผ์ค€๋‹ค.


โœ๋‚ด ์ฝ”๋“œ1 - HashMap<String, ArrayList<String>>

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public static int solution(String[][] clothes) {
        Map<String, ArrayList<String>> clothing = new HashMap<String, ArrayList<String>>();
        ArrayList<String> details;
        
        for(int i=0; i<clothes.length; i++) {
        	if(clothing.containsKey(clothes[i][1])) { // ๋งต์— ์กด์žฌํ•˜๋Š” ํ‚ค๋ผ๋ฉด
        		clothing.get(clothes[i][1]).add(clothes[i][0]);
        	}
        	else {
        		details = new ArrayList<String>(); // ์ƒˆ๋กœ์šด List ์ƒ์„ฑ
        		details.add(clothes[i][0]);
        		clothing.put(clothes[i][1], details);
        	}
        }
        
//        Set<String> keys = clothing.keySet(); // ๋งต์˜ ํ‚ค ์ง‘ํ•ฉ 
        Collection<ArrayList<String>> values = clothing.values(); // ๋งต์˜ value์ง‘ํ•ฉ
        Iterator<ArrayList<String>> iter = values.iterator();
        int answer = 1;
        while(iter.hasNext()) {
        	int value = iter.next().size();
        	answer *= value+1;
        }
        
        return answer-1;
    }

}

โœ๋‚ด ์ฝ”๋“œ2 - HashMap<String, Integer>

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        // map.put(clothes[0][1], 1);
        for(int i=0; i<clothes.length; i++){
        	String type = clothes[i][1];
            if(map.get(type) == null) { // ํ•ด๋‹น ์˜ท์˜ ์ข…๋ฅ˜๊ฐ€ ์—†์„ ๋•Œ
            	map.put(type, 1);
            }
            else {
            	int num = map.get(type);
            	map.put(type, num+1); // ๊ฐœ์ˆ˜ ์ถ”๊ฐ€
            }
        }
        
        // ์ด ์˜ท์˜ ์กฐํ•ฉ : ์˜ท์˜ ๊ฐœ์ˆ˜ + ์•ˆ์ž…๋Š” ๊ฒฝ์šฐ(1)
        for(int value : map.values()) {
        	answer *= (value+1);
        }
        
        // ๋งจ๋ชธ์ธ ๊ฒฝ์šฐ(1)๋ฅผ ๋นผ์ค€๋‹ค.
        return answer - 1;
    }
}

๐Ÿ–1์˜ ํ’€์ด๋ณด๋‹ค ๋ณต์žกํ•˜์ง€ ์•Š๊ณ  ๊ฐœ์ˆ˜๋งŒ ํŒŒ์•…ํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค!
๐Ÿ–map์— 0๋ฒˆ์งธ๋ฅผ ๋จผ์ € ๋„ฃ์–ด์ค€ ์ด์œ ๋Š” 1์˜ ํ’€์ด๋ฅผ ํ•  ๋•Œ ArrayList๊ฐ€ ๋น„์–ด์žˆ์–ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋˜(?) ๊ธฐ์–ต์ด ์žˆ๋Š”๋ฐ ๊ตณ์ด ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋Š” ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ์ž„์„ ๊ฐ™์ด ์ˆ˜๊ฐ•ํ•˜๋Š” ์ปค๋ฎค๋Ÿฌ๋„ˆ๋ถ„๋“ค์˜ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค!๐Ÿฃ (๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์‚ฌ๋ž‘ํ•ด์š”)



๐Ÿญ๊ฐ•์˜๋‚ด์šฉ

โœ”๏ธ์œ„์žฅ ์•„์ดํ…œ์˜ ์ข…๋ฅ˜๋ณ„๋กœ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š”๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค. => ํ•ด์‰ฌ ์‚ฌ์šฉ(๋งต)
โœ”๏ธMap<String, Integer> ๋งต์€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ new๋กœ ์ƒ์„ฑ์€ ์•ˆ๋˜๊ณ  ๋งต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.(ํ•ด์‰ฌ๋งต์€ ๊ทธ ์ค‘์— ํ•˜๋‚˜)


โœ๐Ÿป๊ฐ•์˜ ์ฝ”๋“œ

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        Map<String, Integer> counts = new HashMap<String, Integer>();
        
        for(String[] c : clothes) {
            // c[0] ์˜์ƒ ์ด๋ฆ„
            // c[1] ์˜์ƒ ์ข…๋ฅ˜ 
            // ์ด๋ฆ„์€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์ข…๋ฅ˜๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•œ๋‹ค.
            String type = c[1];
            
            // counts.put(type, counts.get(type) == null ? 0 : counts.get(type) + 1);
            // ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋กœ ํ’€์–ด๋„ ๋˜์ง€๋งŒ, map์˜ getOrDefaultํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์ค€๋‹ค.
            counts.put(type, counts.getOrDefault(type, 0) + 1);
        }
        
        int answer = 1;
        for(Integer c : counts.values()) {
            answer *= c + 1;
        }
        
        // ๋งจ๋ชธ์ธ ๊ฒฝ์šฐ(1)๋ฅผ ๋นผ์ค€๋‹ค.
        return answer - 1;
    }
}

โœ”๏ธfor(String[] c : clothes) ์ด๋Ÿฐ์‹์œผ๋กœ์˜ for๋ฌธ ํ™œ์šฉ๋ฒ•์„ ์ตํ˜€๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.


โœ๐Ÿป๊ฐ•์˜ ์ฝ”๋“œ - ์ฝ”๋“œ ๋ฆฌํŽ™ํ† ๋ง

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
    	return Arrays.stream(clothes)
        	.map(c -> c[1]) // ์˜ท์˜ ์ข…๋ฅ˜๋“ค์„
             	.distict // ์ค‘๋ณต์—†์ด type์œผ๋กœ
                .map(type -> Arrays.stream(clothes).filter(c -> c[1].equals(type)).count())
                .map(c -> c + 1)
                .reduce(1, (c, n) -> (c * n) - 1;
    }
}

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

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ