Programmers #36

์ด๊ฐ•์šฉยท2023๋…„ 9์›” 8์ผ
0

Programmers

๋ชฉ๋ก ๋ณด๊ธฐ
35/58

H-Index

๐Ÿ“‘ ๋ฌธ1) H-Index๋Š” ๊ณผํ•™์ž์˜ ์ƒ์‚ฐ์„ฑ๊ณผ ์˜ํ–ฅ๋ ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ์–ด๋А ๊ณผํ•™์ž์˜ H-Index๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ธ h๋ฅผ ๊ตฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์œ„ํ‚ค๋ฐฑ๊ณผ1์— ๋”ฐ๋ฅด๋ฉด, H-Index๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๊ณผํ•™์ž๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ nํŽธ ์ค‘, h๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ด hํŽธ ์ด์ƒ์ด๊ณ  ๋‚˜๋จธ์ง€ ๋…ผ๋ฌธ์ด h๋ฒˆ ์ดํ•˜ ์ธ์šฉ๋˜์—ˆ๋‹ค๋ฉด h์˜ ์ตœ๋Œ“๊ฐ’์ด ์ด ๊ณผํ•™์ž์˜ H-Index์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๊ณผํ•™์ž๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ์˜ ์ธ์šฉ ํšŸ์ˆ˜๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด citations๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ด ๊ณผํ•™์ž์˜ H-Index๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.


์ œํ•œ์‚ฌํ•ญ

  • ๊ณผํ•™์ž๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ์˜ ์ˆ˜๋Š” 1ํŽธ ์ด์ƒ 1,000ํŽธ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๋…ผ๋ฌธ๋ณ„ ์ธ์šฉ ํšŸ์ˆ˜๋Š” 0ํšŒ ์ด์ƒ 10,000ํšŒ ์ดํ•˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

citationsreturn
[3,0,6,1,5]3

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

์ด ๊ณผํ•™์ž๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ์˜ ์ˆ˜๋Š” 5ํŽธ์ด๊ณ , ๊ทธ์ค‘ 3ํŽธ์˜ ๋…ผ๋ฌธ์€ 3ํšŒ ์ด์ƒ ์ธ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ 2ํŽธ์˜ ๋…ผ๋ฌธ์€ 3ํšŒ ์ดํ•˜ ์ธ์šฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ณผํ•™์ž์˜ H-Index๋Š” 3์ž…๋‹ˆ๋‹ค.


๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.Arrays;

public class Citations {
	
	
	public static int solution(int[] citations) {
        
        
        Arrays.sort(citations);
        int length = citations.length;
       
        for(int i = 0; i < length; i++) {
        	int h = length - i;
        	if(citations[i] >= h) {
        		return h;
        	}
     
        }
     
        return 0;
       
    }
	
	
	public static void main(String[] args) {
		solution(new int[] {3,0,6,1,5});
	}

}

๋‚˜์˜ ์ƒ๊ฐ

๋จผ์ €, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง„ citations์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์„ ํ•œ๋‹ค.

๋ฌธ์ œ์—์„œ ๋งํ•˜๋Š” h-index๋Š” n๊ฐœ์˜ ๋…ผ๋ฌธ ์ค‘ h๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ด hํŽธ ์ด์ƒ์ด๊ณ  ๋‚˜๋จธ์ง€ ๋‚จ์€ ๋…ผ๋ฌธ์ด h๋ฒˆ ์ดํ•˜ ์ธ์šฉ๋˜์—ˆ๋‹ค๋ฉด h์˜ ์ตœ๋Œ“๊ฐ’์ด h-index ์ด๋‹ค.

for(int i = 0; i < length; i++) {
	int h = length - i;
    if(citations[i] >= h) {
    	return h;
    } 
}
i = 0, citations[i] = 0, h = 5
i = 1, citations[i] = 1, h = 4
i = 2, citations[i] = 3, h = 3
i = 3, citations[i] = 5, h = 2
i = 4, citations[i] = 6, h = 1
  • int h = length - i : ์—ฌ๊ธฐ์„œ h๋Š” ํ˜„์žฌ ์ธ์šฉ ํšŸ์ˆ˜๊ฐ€ h ์ด์ƒ์ธ ๋…ผ๋ฌธ์˜ ์ตœ์†Œ ๊ฐฏ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์™œ๋ƒํ•˜๋ฉด citations ๋ฐฐ์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, i ๋ฒˆ์งธ ๋…ผ๋ฌธ์˜ ์ธ์šฉ ํšŸ์ˆ˜๊ฐ€ h์ด์ƒ์ด๋ผ๋ฉด,i ์ดํ›„์˜ ๋ชจ๋“  ๋…ผ๋ฌธ๋“ค๋„ h ์ด์ƒ์˜ ์ธ์šฉ ํšŸ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋จ

  • if(citations[i] >= h ์ด ์กฐ๊ฑด์€ ํ˜„์žฌ ํ™•์ธํ•˜๋Š” ๋…ผ๋ฌธ์˜ ์ธ์šฉ ํšŸ์ˆ˜๊ฐ€ h ์ด์ƒ์ธ์ง€ ํ™•์ธํ•˜๊ณ , ๋งŒ์•ฝ h ์ด์ƒ์ด๋ผ๋ฉด h๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ด hํŽธ ์ด์ƒ์ด ๋˜๋ฏ€๋กœ, ํ˜„์žฌ์˜ h๋Š” H-Index๊ฐ€ ๋œ๋‹ค.


ํ• ์ธ ํ–‰์‚ฌ

๐Ÿ“‘ ๋ฌธ2) XYZ ๋งˆํŠธ๋Š” ์ผ์ •ํ•œ ๊ธˆ์•ก์„ ์ง€๋ถˆํ•˜๋ฉด 10์ผ ๋™์•ˆ ํšŒ์› ์ž๊ฒฉ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. XYZ ๋งˆํŠธ์—์„œ๋Š” ํšŒ์›์„ ๋Œ€์ƒ์œผ๋กœ ๋งค์ผ ํ•œ ๊ฐ€์ง€ ์ œํ’ˆ์„ ํ• ์ธํ•˜๋Š” ํ–‰์‚ฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์€ ํ•˜๋ฃจ์— ํ•˜๋‚˜์”ฉ๋งŒ ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋œฐํ•œ ์ •ํ˜„์ด๋Š” ์ž์‹ ์ด ์›ํ•˜๋Š” ์ œํ’ˆ๊ณผ ์ˆ˜๋Ÿ‰์ด ํ• ์ธํ•˜๋Š” ๋‚ ์งœ์™€ 10์ผ ์—ฐ์†์œผ๋กœ ์ผ์น˜ํ•  ๊ฒฝ์šฐ์— ๋งž์ถฐ์„œ ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์ด ๋ฐ”๋‚˜๋‚˜ 3๊ฐœ, ์‚ฌ๊ณผ 2๊ฐœ, ์Œ€ 2๊ฐœ, ๋ผ์ง€๊ณ ๊ธฐ 2๊ฐœ, ๋ƒ„๋น„ 1๊ฐœ์ด๋ฉฐ, XYZ ๋งˆํŠธ์—์„œ 15์ผ๊ฐ„ ํšŒ์›์„ ๋Œ€์ƒ์œผ๋กœ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์ด ๋‚ ์งœ ์ˆœ์„œ๋Œ€๋กœ ์น˜ํ‚จ, ์‚ฌ๊ณผ, ์‚ฌ๊ณผ, ๋ฐ”๋‚˜๋‚˜, ์Œ€, ์‚ฌ๊ณผ, ๋ผ์ง€๊ณ ๊ธฐ, ๋ฐ”๋‚˜๋‚˜, ๋ผ์ง€๊ณ ๊ธฐ, ์Œ€, ๋ƒ„๋น„, ๋ฐ”๋‚˜๋‚˜, ์‚ฌ๊ณผ, ๋ฐ”๋‚˜๋‚˜์ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค. ์ฒซ์งธ ๋‚ ๋ถ€ํ„ฐ ์—ดํ˜ ๊ฐ„์—๋Š” ๋ƒ„๋น„๊ฐ€ ํ• ์ธํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ์งธ ๋‚ ์—๋Š” ํšŒ์›๊ฐ€์ž…์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ ๋‚ ๋ถ€ํ„ฐ ์—ดํ˜ ๊ฐ„์—๋Š” ๋ฐ”๋‚˜๋‚˜๋ฅผ ์›ํ•˜๋Š” ๋งŒํผ ํ• ์ธ๊ตฌ๋งคํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์งธ ๋‚ ์—๋„ ํšŒ์›๊ฐ€์ž…์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์…‹์งธ ๋‚ , ๋„ท์งธ ๋‚ , ๋‹ค์„ฏ์งธ ๋‚ ๋ถ€ํ„ฐ ๊ฐ๊ฐ ์—ดํ˜์€ ์›ํ•˜๋Š” ์ œํ’ˆ๊ณผ ์ˆ˜๋Ÿ‰์ด ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์…‹ ์ค‘ ํ•˜๋ฃจ์— ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด want์™€ ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์˜ ์ˆ˜๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด number, XYZ ๋งˆํŠธ์—์„œ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด discount๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ํšŒ์›๋“ฑ๋ก์‹œ ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์„ ๋ชจ๋‘ ํ• ์ธ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํšŒ์›๋“ฑ๋ก ๋‚ ์งœ์˜ ์ด ์ผ์ˆ˜๋ฅผ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์‹œ์˜ค. ๊ฐ€๋Šฅํ•œ ๋‚ ์ด ์—†์œผ๋ฉด 0์„ return ํ•ฉ๋‹ˆ๋‹ค.


์ œํ•œ์‚ฌํ•ญ

  • 1 โ‰ค want์˜ ๊ธธ์ด = number์˜ ๊ธธ์ด โ‰ค 10
    • 1 โ‰ค number์˜ ์›์†Œ โ‰ค 10
    • number[i]๋Š” want[i]์˜ ์ˆ˜๋Ÿ‰์„ ์˜๋ฏธํ•˜๋ฉฐ, number์˜ ์›์†Œ์˜ ํ•ฉ์€ 10์ž…๋‹ˆ๋‹ค.
  • 10 โ‰ค discount์˜ ๊ธธ์ด โ‰ค 100,000
  • want์™€ discount์˜ ์›์†Œ๋“ค์€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • 1 โ‰ค want์˜ ์›์†Œ์˜ ๊ธธ์ด, discount์˜ ์›์†Œ์˜ ๊ธธ์ด โ‰ค 12

์ž…์ถœ๋ ฅ ์˜ˆ

wantnumberdiscountresult
["banana", "apple", "rice", "pork", "pot"][3,2,2,2,1][["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"]]3
["apple"][10][["banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana"]]0

๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.HashMap;

public class DiscountEvent {
	
	
	public static int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        HashMap<String, Integer> wantMap = new HashMap<>();
        
        for(int i = 0; i < want.length; i++) {
        	wantMap.put(want[i], number[i]);
        }
        
        
        int totalDiscountDay = 0;
        
        for(int a : number) {
        	totalDiscountDay += a;
        }
        
        
        for(int i = 0; i <= discount.length - totalDiscountDay; i++) {
            HashMap<String, Integer> tempMap = new HashMap<>(wantMap);
            for(int j = i; j < i + totalDiscountDay; j++) {
                if(tempMap.containsKey(discount[j])) {
                    tempMap.put(discount[j], tempMap.get(discount[j]) - 1);
                    if(tempMap.get(discount[j]) == 0) {
                        tempMap.remove(discount[j]);
                    }
                }
            }
            
            if(tempMap.isEmpty()) {
                answer++;
            }
        }
        
        
        
      
        return answer;
    }
	
	public static void main(String[] args) {
		
		String[] want = {"banana", "apple", "rice", "pork", "pot"};
		int[] number = {3, 2, 2, 2, 1};
		String[] discount = {"chicken", "apple", "apple", "banana", "rice", 
				"apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"};
		
		solution(want, number, discount);
	}

}

๋‚˜์˜ ์ƒ๊ฐ

์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š” want,number๋ฅผ key, value์— ์ €์žฅํ•ด์•ผํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด map์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ map์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋œ๋‹ค.

๋งˆํŠธ์—์„œ ํ• ์ธ ํ•˜๋Š” ํ–‰์‚ฌ ํ’ˆ๋ชฉ์„ ๋‹ด์€ ๋งค๊ฐœ๋ณ€์ˆ˜ discount๋Š” ํ•ญ์ƒ want ๋ฐฐ์—ด๋ณด๋‹ค ํฌ๊ณ , number ์•ˆ์— ๋“  {3,2,2,2,1} ํ•„์š”ํ•œ ๊ฐฏ์ˆ˜์˜ ์ด ํ•ฉ์„ ์ €์žฅํ•  totalDiscountDay์— ์ €์žฅํ•œ๋‹ค.

๋งŒ์•ฝ, discount [0] ~ discount [9] (์ด 10๊ฐœ) ํ•ญ๋ชฉ์ด ์—ฐ์†์œผ๋กœ ๊ฐฏ์ˆ˜๋ฅผ ์ฒดํฌํ•˜์—ฌ ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” want ํ•ญ๋ชฉ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ฆ‰,

discount [0] ~ discount [9]
discount [1] ~ discount [10]
discount [2] ~ discount [11]
discount [3] ~ discount [12]
discount [4] ~ discount [13]

์ˆœ์„œ๋กœ ์—ฐ์†์ ์ธ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. ํ•ต์‹ฌ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

for(int i = 0; i <= discount.length - totalDiscountDay; i++) {
	HashMap<String, Integer> tempMap = new HashMap<>(wantMap);
    for(int j = i; j < i + totalDiscountDay; j++) {
    	if(tempMap.containsKey(discount[j])) {
        	tempMap.put(discount[j], tempMap.get(discount[j]) - 1);
            if(tempMap.get(discount[j]) == 0) {
            	tempMap.remove(discount[j]);
            }
         }
    }
            
    if(tempMap.isEmpty()) {
    	answer++;
    }
 }

ํ˜„์žฌ map์— ์ €์žฅ๋œ ํ•ญ๋ชฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

for(int i = 0; i <= 14 - 10; i++)

  • ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” want์˜ ํ•ญ๋ชฉ์˜ ๊ฐฏ์ˆ˜๊ฐ€ 5๊ฐœ ์ด๊ธฐ๋•Œ๋ฌธ์— ๋ฐ”๊นฅ for์€ ์œ„์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

HashMap<String, Integer> tempMap = new HashMap<>(wantMap)

  • ์—ฌ๊ธฐ์„œ tempMap์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฐ˜๋ณต์„ ํ•œ๋ฒˆ ๋Œ๋•Œ๋งˆ๋‹ค ๊ทธ ์•ˆ์— ์žˆ๋Š” ๊ฐ’๋“ค์ด ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

for(int j = i; j < i + totalDiscountDay; j++)

  • ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์ธ๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. ๋™์ž‘ ์ˆœ์„œ๋ฅผ ๋ณด๋ฉด ์ดํ•ด๋ ๊ฒƒ์ด๋‹ค.
j = 0 ; j < 0 + 10; j++
j = 1 ; j < 1 + 10; j++
j = 2 ; j < 2 + 10; j++
j = 3 ; j < 3 + 10; j++
discount [0] ~ discount [9]
discount [1] ~ discount [10]
discount [2] ~ discount [11]
discount [3] ~ discount [12]
discount [4] ~ discount [13]
if(tempMap.containsKey(discount[j])) {
	tempMap.put(discount[j], tempMap.get(discount[j]) - 1);
    if(tempMap.get(discount[j]) == 0) {
    	tempMap.remove(discount[j]);
    }
}

ํ•ด๋‹น ๋กœ์ง์€ tempMap์— discount[j] ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์žˆ์œผ๋ฉด value๊ฐ’์„ 1๊ฐœ์”ฉ ๋นผ์ฃผ๋Š” ๋กœ์ง์ด๋‹ค. ์ฆ‰, tempMap ์˜ ๋ชจ๋“  value๊ฐ’์ด 0์ด๋˜๋ฉด , temp.remove() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ tempMap์„ ๋นˆ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด ๋ฒ„๋ฆฐ๋‹ค. ์ฆ‰, discount์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์ด want์— ํฌํ•จ๋˜๊ณ , ๊ฐฏ์ˆ˜๊นŒ์ง€ ๋ชจ๋‘ ์ผ์น˜ํ•˜๋ฉด answer++๋ฅผ ํ†ตํ•ด ์ตœ์ข…์ ์œผ๋กœ returnํ•œ๋‹ค.


ํ–‰๋ ฌ์˜ ๊ณฑ์…ˆ

๐Ÿ“‘ ๋ฌธ3) 2์ฐจ์› ํ–‰๋ ฌ arr1๊ณผ arr2๋ฅผ ์ž…๋ ฅ๋ฐ›์•„, arr1์— arr2๋ฅผ ๊ณฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜, solution์„ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.


์ œํ•œ์กฐ๊ฑด

  • ํ–‰๋ ฌ arr1, arr2์˜ ํ–‰๊ณผ ์—ด์˜ ๊ธธ์ด๋Š” 2 ์ด์ƒ 100 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ํ–‰๋ ฌ arr1, arr2์˜ ์›์†Œ๋Š” -10 ์ด์ƒ 20 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๊ณฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด๋งŒ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

arr1arr2return
[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]][[5, 4, 3], [2, 4, 1], [3, 1, 1]][[22, 22, 11], [36, 28, 18], [29, 20, 14]]

๋‚˜์˜ ํ’€์ด

package programmers;

public class MatrixProduct {
	
	public static int[][] solution(int[][] arr1, int[][] arr2) {
		
		
		int row1 = arr1.length;
		int col1 = arr1[0].length;
		int row2 = arr2.length;
		int col2 = arr2[0].length;
		
		int[][] answer = new int[row1][col2];
		
		
		for(int i = 0; i < row1; i++) {
			for(int j = 0; j < col2; j++) {
				int sum = 0;
				
				for(int k = 0; k < col1; k++) {
					sum += arr1[i][k] * arr2[k][j];
				}
				
				answer[i][j] = sum;
			}
		}
		
		
       
        return answer;
    }
	
	
	public static void main(String[] args) {
		
		int[][] arr1 = new int[][] {{1,4},{3,2},{4,1}};
		
		int[][] arr2 = new int[][] {{3,3},{3,3}};
		
		
		
		solution(arr1, arr2);
	}
	
	
	

}

๋‚˜์˜ ์ƒ๊ฐ

  1. ํ–‰๋ ฌ์˜ ๊ณฑ์…ˆ์—์„œ๋Š” arr1์˜ ์—ด ์ˆ˜ (col1)์™€ arr2 ์˜ ํ–‰์ˆ˜ (row2)๊ฐ€ ๊ฐ™์•„์•ผํ•œ๋‹ค.

  2. ๊ฒฐ๊ณผ ํ–‰๋ ฌ์˜ ํฌ๊ธฐ ๊ฒฐ์ •

  • answer์˜ ํฌ๊ธฐ๋Š” arr1์˜ ํ–‰์ˆ˜(row1) * arr2์˜ ์—ด ์ˆ˜(col2)๋กœ ๊ฒฐ์ •

ํ•ต์‹ฌ ๋กœ์ง

for(int i = 0; i < row1; i++) {
    for(int j = 0; j < col2; j++) {
        int sum = 0;
        for(int k = 0; k < col1; k++) {
            sum += arr1[i][k] * arr2[k][j];
        }
        answer[i][j] = sum;
    }
}

sum += arr1[i][k] * arr2[k][j]

  • arr1์˜ ์—ด์ˆ˜ k ์™€ arr2์˜ ํ–‰์ˆ˜ k๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑ

์บ์‹œ

๐Ÿ“‘ ๋ฌธ4) ์ง€๋„๊ฐœ๋ฐœํŒ€์—์„œ ๊ทผ๋ฌดํ•˜๋Š” ์ œ์ด์ง€๋Š” ์ง€๋„์—์„œ ๋„์‹œ ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•ด๋‹น ๋„์‹œ์™€ ๊ด€๋ จ๋œ ๋ง›์ง‘ ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ์–ด ๋ณด์—ฌ์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค.
์ด ํ”„๋กœ๊ทธ๋žจ์˜ ํ…Œ์ŠคํŒ… ์—…๋ฌด๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” ์–ดํ”ผ์น˜๋Š” ์„œ๋น„์Šค๋ฅผ ์˜คํ”ˆํ•˜๊ธฐ ์ „ ๊ฐ ๋กœ์ง์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์ธก์ •์„ ์ˆ˜ํ–‰ํ•˜์˜€๋Š”๋ฐ, ์ œ์ด์ง€๊ฐ€ ์ž‘์„ฑํ•œ ๋ถ€๋ถ„ ์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์˜ ์‹คํ–‰์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
์–ดํ”ผ์น˜๋Š” ์ œ์ด์ง€์—๊ฒŒ ํ•ด๋‹น ๋กœ์ง์„ ๊ฐœ์„ ํ•˜๋ผ๊ณ  ๋‹ฆ๋‹ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์˜€๊ณ , ์ œ์ด์ง€๋Š” DB ์บ์‹œ๋ฅผ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์บ์‹œ ํฌ๊ธฐ๋ฅผ ์–ผ๋งˆ๋กœ ํ•ด์•ผ ํšจ์œจ์ ์ธ์ง€ ๋ชฐ๋ผ ๋‚œ๊ฐํ•œ ์ƒํ™ฉ์ด๋‹ค.

์–ดํ”ผ์น˜์—๊ฒŒ ์‹œ๋‹ฌ๋ฆฌ๋Š” ์ œ์ด์ง€๋ฅผ ๋„์™€, DB ์บ์‹œ๋ฅผ ์ ์šฉํ•  ๋•Œ ์บ์‹œ ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ์‹คํ–‰์‹œ๊ฐ„ ์ธก์ • ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.


์ž…๋ ฅ ํ˜•์‹

  • ์บ์‹œ ํฌ๊ธฐ(cacheSize)์™€ ๋„์‹œ์ด๋ฆ„ ๋ฐฐ์—ด(cities)์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
  • cacheSize๋Š” ์ •์ˆ˜์ด๋ฉฐ, ๋ฒ”์œ„๋Š” 0 โ‰ฆ cacheSize โ‰ฆ 30 ์ด๋‹ค.
  • cities๋Š” ๋„์‹œ ์ด๋ฆ„์œผ๋กœ ์ด๋ค„์ง„ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ, ์ตœ๋Œ€ ๋„์‹œ ์ˆ˜๋Š” 100,000๊ฐœ์ด๋‹ค.
  • ๊ฐ ๋„์‹œ ์ด๋ฆ„์€ ๊ณต๋ฐฑ, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž ๋“ฑ์ด ์—†๋Š” ์˜๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋„์‹œ ์ด๋ฆ„์€ ์ตœ๋Œ€ 20์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹

  • ์ž…๋ ฅ๋œ ๋„์‹œ์ด๋ฆ„ ๋ฐฐ์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ, "์ด ์‹คํ–‰์‹œ๊ฐ„"์„ ์ถœ๋ ฅํ•œ๋‹ค.

์กฐ๊ฑด

  • ์บ์‹œ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ LRU(Least Recently Used)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • cache hit์ผ ๊ฒฝ์šฐ ์‹คํ–‰์‹œ๊ฐ„์€ 1์ด๋‹ค.
  • cache miss์ผ ๊ฒฝ์šฐ ์‹คํ–‰์‹œ๊ฐ„์€ 5์ด๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

์บ์‹œํฌ๊ธฐ(cacheSize)๋„์‹œ์ด๋ฆ„(cities)์‹คํ–‰์‹œ๊ฐ„
3["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"]50
3["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"]21
2["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Rome", "Paris", "Jeju", "NewYork", "Rome"]60
5["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Rome", "Paris", "Jeju", "NewYork", "Rome"]52
2["Jeju", "Pangyo", "NewYork", "newyork"]16
0["Jeju", "Pangyo", "Seoul", "NewYork", "LA"]25

๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.LinkedList;

public class Cache {
	
	public static int solution(int cacheSize, String[] cities) {
       
        
        LinkedList<String> cityList = new LinkedList<>();
        
        int runTime = 0;
        
        for(String city : cities) {
        	
        	city = city.toLowerCase();
        	
        	if(cityList.contains(city)) {
        		cityList.remove(city);
        		runTime += 1;
        	}else {
        		if(cityList.size() == cacheSize && cacheSize != 0) {
        			cityList.removeFirst();
        		}
        		runTime += 5;
        	}
        	
        	if(cacheSize != 0) {
        		cityList.addLast(city);
        	}
        	
        }
        
        
       
        return runTime;
    }
	
	
	public static void main(String[] args) {
		
		String[] cities = {"Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"};
		solution(3, cities);
	}

}

๋‚˜์˜ ์ƒ๊ฐ

LRU(Least Recently Used)

  • ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ ์บ์‹œ์—์„œ ๊ฐ€์žฅ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์„ ์‹๋ณ„ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์ฒดํ•  ๋•Œ ์‚ฌ์šฉ

  • ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ตœ๊ทผ ์‚ฌ์šฉ ์‹œ์ ์„ ๊ธฐ๋ก

  • ์บ์‹œ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ๊ฐ€์žฅ ์˜ค๋ž˜ ์ „์— ์‚ฌ์šฉ๋œ ๋ฐ์ดํ„ฐ (์ฆ‰, ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ)๋ฅผ ์บ์‹œ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…

์˜ˆ์ œ 1๋ฒˆ ์˜ˆ์‹œ

cacheSize = 3
cities = ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"]

์‹œ์ž‘ํ•  ๋•Œ, ์บ์‹œ๋Š” ๋น„์–ด์žˆ์Œ

  1. Jeju
  • cache miss(์บ์‹œ์— Jeju๊ฐ€ ์—†์Œ)
  • [Jeju] (Jeju ์บ์‹œ์— ์ถ”๊ฐ€๋จ)
  • ์‹คํ–‰์‹œ๊ฐ„ : 5
  1. Pangyo
  • cache miss(์บ์‹œ์— Pangyo๊ฐ€ ์—†์Œ)
  • [Jeju,Pangyo] (Pangyo ์บ์‹œ์— ์ถ”๊ฐ€๋จ)
  • ์‹คํ–‰์‹œ๊ฐ„ : 5
  1. Seoul
  • cache miss(์บ์‹œ์— Seoul์ด ์—†์Œ)
  • [Jeju,Pangyo,Seoul] (Seoul ์บ์‹œ์— ์ถ”๊ฐ€๋จ)
  • ์‹คํ–‰์‹œ๊ฐ„ : 5

์ด ์‹œ์ ์—์„œ๋Š” ์บ์‹œ๊ฐ€ ๊ฝ‰ ์ฐจ ์žˆ์Œ, ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ๋„์‹œ๋ฅผ ์บ์‹œ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜ ์ „์— ์‚ฌ์šฉ๋œ ๋„์‹œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•จ

  1. NewYork
  • cache miss(์บ์‹œ์— NewYork์ด ์—†์Œ)
  • ๊ฐ€์žฅ ์˜ค๋ž˜ ์ „์— ์‚ฌ์šฉ๋œ Jeju๋ฅผ ์ œ๊ฑฐ
  • [Pangyo, Seoul, NewYork] (NewYork ์บ์‹œ์— ์ถ”๊ฐ€๋จ)
  • ์‹คํ–‰์‹œ๊ฐ„ : 5

์ด์ œ Pangyo๊ฐ€ ๊ฐ€์žฅ ์˜ค๋ž˜ ์ „์— ์‚ฌ์šฉ๋œ ๋„์‹œ

  1. LA
  • cache miss(์บ์‹œ์— LA๊ฐ€ ์—†์Œ)
  • ๊ฐ€์žฅ ์˜ค๋ž˜ ์ „์— ์‚ฌ์šฉ๋œ Pangyo๋ฅผ ์ œ๊ฑฐ
  • [Seoul,NewYork,LA] (LA ์บ์‹œ์— ์ถ”๊ฐ€๋จ)
  • ์‹คํ–‰์‹œ๊ฐ„ : 5

๊ณ„์† ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ˆ„์ ํ•˜๋ฉด ์ตœ์ข… ์‹คํ–‰ ์‹œ๊ฐ„์€ 50์ด ๋จ

์ฃผ์š” ๋กœ์ง์„ ์‚ดํŽด๋ณด์ž

ํ•ต์‹ฌ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

LinkedList<String> cityList = new LinkedList<>();
int runTime = 0;
        
for(String city : cities) {
        	
	city = city.toLowerCase();
        	
    if(cityList.contains(city)) {
        cityList.remove(city);
       	runTime += 1;
    }else {
    	if(cityList.size() == cacheSize && cacheSize != 0) {
        	cityList.removeFirst();
        }
    	runTime += 5;
    }
        	
    if(cacheSize != 0) {
   		cityList.addLast(city);
    }
        	
 }		

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š” int cacheSize, String[] cities ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ List์˜ maxSize์™€ ๋‚˜์—ด๋œ cities๋ฅผ ๋‹ด์„ List๋ฅผ ์„ ์–ธํ•˜๋Š”๋ฐ, ์บ์‹œ๋Š” ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ˆœ์„œ๊นŒ์ง€ ์ €์žฅํ•˜๋Š” LinkedList๋ฅผ ์‚ฌ์šฉ. ๊ทธ๋ฆฌ๊ณ  ์ „์ฒด cities๋ฅผ ์ˆœํšŒํ•˜๋Š”๋ฐ, ์ˆœํšŒํ• ๋•Œ์˜ ๋ชจ๋“  city = city.toLowCase()๋กœ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜(๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ณ„ ์—†์Œ)ํ•œ๋‹ค. ์ฒ˜์Œ 3๊ฐœ์˜ ๋„์‹œ๋Š” cityList ์— ํฌํ•จ๋ผ์žˆ์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— runTime +=5 ๋ฐ if(cacheSize != 0){cityList.addLast(city)} ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ cacheSize์™€ cityList์˜ size๊ฐ€ ๊ฐ™์•„์ง€๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ cityList์˜ ์ฒซ๋ฒˆ์งธ Index๋ฅผ ์ œ๊ฑฐ, ๋‹ค์Œ city๋ฅผ ๋งจ๋์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋งŒ์•ฝ, cityList์— ์กด์žฌํ•˜๋Š” ๋„์‹œ๊ฐ€ ๋‹ค์‹œ ๋“ฑ์žฅํ•˜๋ฉด, cityList์—์„œ ํ•ด๋‹น ๋„์‹œ์˜ ์ด๋ฆ„์„ ์ œ๊ฑฐํ•˜๊ณ , runTime +=1; ์ดํ›„, ๋‹ค์‹œ ๊ทธ ๋„์‹œ๋ฅผ cityList ๋งจ ๋์— ์ถ”๊ฐ€ํ•œ๋‹ค.


์˜์ƒ

๐Ÿ“‘ ๋ฌธ5) ์ฝ”๋‹ˆ๋Š” ๋งค์ผ ๋‹ค๋ฅธ ์˜ท์„ ์กฐํ•ฉํ•˜์—ฌ ์ž…๋Š”๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

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

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

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


์ œํ•œ์‚ฌํ•ญ

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

์ž…์ถœ๋ ฅ ์˜ˆ

clothesreturn
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]5
[["crow_mask", "face"], ["blue_sunglasses", "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

๋‚˜์˜ ํ’€์ด

package programmers;

import java.util.ArrayList;
import java.util.HashMap;

public class Clothes {
	
	 public static int solution(String[][] clothes) {
	        int answer = 1;
	        HashMap<String, ArrayList<String>> clothesMap = new HashMap<>();
	        
	        
	        
	        for(String[] cloth : clothes) {
	        	
	        	String clothName = cloth[0];
	        	String clothType = cloth[1];
	        	
	        	if(!clothesMap.containsKey(clothType)) {
	        		clothesMap.put(clothType, new ArrayList<>());
	        	}
	        	
	        	clothesMap.get(clothType).add(clothName);
	        	
	        }
	        
	       
	        for(ArrayList<String> value : clothesMap.values()) {
	        	answer *= (value.size() + 1);
	        }
	        
	        return answer - 1;
	 }
	 
	 public static void main(String[] args) {
		 
		String[][] clothes = {{"crow_mask", "face"}, {"blue_sunglasses", "face"}, {"smoky_makeup", "face"}};
		solution(clothes);
	}

}

๋‚˜์˜ ์ƒ๊ฐ

์˜์ƒ์˜ ์ข…๋ฅ˜์™€ ์˜์ƒ์˜ ์ด๋ฆ„์„ Map ํ˜•์‹์œผ๋กœ ์˜์ƒ์˜ ์ข…๋ฅ˜๋Š” key, ์˜์ƒ์˜ ์ด๋ฆ„๋“ค์„ value๋กœ ๋“ค์–ด๊ฐ€๋Š”๋ฐ, value์˜ ํ˜•์‹์€ ArrayList๋กœ valuer๊ฐ’์ด ํ•˜๋‚˜๊ฐ€ ๋ ์ˆ˜๋„, ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

for(String[] cloth : clothes) {
	        	
	String clothName = cloth[0];
	String clothType = cloth[1];
	        	
	if(!clothesMap.containsKey(clothType)) {
		clothesMap.put(clothType, new ArrayList<>());
	}
	        	
	clothesMap.get(clothType).add(clothName);
	        	
}

for๋ฌธ ๋‚ด๋ถ€์— ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์—ฌ for๋ฌธ ๋ฐ˜๋ณต์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ทธ ๊ฐ’๋“ค์ด ๋ณ€๊ฒฝ๋˜๊ฒŒ๋” ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

clothesMap์— ์˜์ƒ์˜ ์ข…๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด clothType๊ณผ, new ArrayList<>()(์ƒˆ๋กœ์šด ArrayList)๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹นํ•˜๋Š” key๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๋ฉด, key์— ํ•ด๋‹นํ•˜๋Š” value๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ

key, value๋กœ Map์„ ๊ตฌ์„ฑํ•œ ๋ชจ์Šต

์ •์ œ๋œ ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ ์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์˜์ƒ์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„  ๊ฐ ์˜์ƒ ์นดํ…Œ๊ณ ๋ฆฌ(type)๋ณ„๋กœ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ํฌํ•จํ•ด์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ , ๋ชจ๋“  ์˜์ƒ์„ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ 1์„ ๋นผ๋ฉด๋œ๋‹ค.

  • ๊ฐ ์˜์ƒ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ํ•ด๋‹น ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์˜์ƒ ๊ฐœ์ˆ˜+1(์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)

  1. eyewear : blue_sunglasses(1๊ฐ€์ง€) + ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ = 1 + 1 = 2
  2. headgear : yellow_hat, green_turban (2๊ฐ€์ง€) + ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ = 2 + 1 = 3

์ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณฑํ•œ ํ›„, ๋ชจ๋“  ์˜์ƒ์„ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ 1์„ ๋บ€ ๊ฒƒ.

๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 2 * 3 -1 = 5

๋กœ์ง์„ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด ๋กœ์ง ์„ค๊ณ„๋Œ€๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

0๊ฐœ์˜ ๋Œ“๊ธ€