본문 바로가기

algorithm

[프로그래머스]위장

https://programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장 | 프로그래머스

 

programmers.co.kr

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_'로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한개의 의상은 입습니다.

입출력의 예

 

clothes                                                                       

[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]            

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

return

5

 

clothes        

[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "facce"]]                     

1. crow_mask 2. blue_sunglasses 3. smoky_makeup

return

3

 

풀이

face, headgear, eyewear 등 의상의 종류에 따라 의상의 수가 몇개가 있는지 구하기 위한 코드이다.

(Step.get(clothes[i][1]) + 1 은 간단한 방법인데 뭔가 획기적인 느낌으로 다가온 코드였다.)

 	if (Stemp.get(clothes[i][1]) == null) {
		 Stemp.put(clothes[i][1], 1);
	} else {
		 Stemp.put(clothes[i][1], Stemp.get(clothes[i][1]) + 1);
	 }

keySet()은 Map에서 key의 값을 모두 다 가져 온다.

그렇기에 각 Key(의상의 종류)에 따라 의상의 수를 구해서 각 각 곱하면 의상의 경우의 수를 구할 수 있다.

+1 을 한 이유는 의상을 입지 않는 경우도 있기 때문이다.

 

마지막에 return answer - 1; 로 -1을 해준 이유는 의상을 하나도 입지 않은 경우는 빼주기 위해서 이다.

	for(String keys: Stemp.keySet()) {
   		answer *= (Stemp.get(keys) + 1);
	}
import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(String[][] clothes) {
        
       Map<String, Integer> Stemp = new HashMap<>();
	   int answer = 1;
	   	   
	   for (int i = 0; i < clothes.length; i++) {
		   
		   if (Stemp.get(clothes[i][1]) == null) {
			   Stemp.put(clothes[i][1], 1);
		   } else {
			   Stemp.put(clothes[i][1], Stemp.get(clothes[i][1]) + 1);
		   }
	   }
	   		   
		   for(String keys: Stemp.keySet()) {
			   answer *= (Stemp.get(keys) + 1);
		   }
        
        return answer - 1;
    }
}

 

문제 풀이 예시)

 

배가 a, b, c 라는 이름의 3개가 있다.

귤은 e, f 라는 이름의 2개가 있다.

 

여기서 배는 안골랐다라는 경우를 포함해서 (0,a,b,c) 4개가 된다. 

마찬가지로 귤도 안골랐다라는 경우를 포함해서 (0,e,f) 3개가 된다.

이렇게 되면 4*3 =  12가지이고 여기서 0,0 인 둘다 안고르는 경우는 없기 떄문에 -1을 해주면 11가지로 답을 구할 수 있다.

 

종류를 하나 더 추가해서 보면

 

배 a,b,c 3개 

귤 e,f 2개

사과 g, h ,i 3개

이렇게 주어졌다고하고 위의 방법대로 하면,

(배 + 1) * (귤 + 1) * (사과 +1) -1 이 총 가지수가 된다.

 

저기 + 1은 그 종류를 안고른 경우가 되기때문에 모든 조합의 가지수가 나오게된다.

 

알고리즘 구성을 보면

입력받은 2차원 문자열 배열에서 같은 종류마다 있는 개수 정보를 저장한다.

그리고 그 개수마다 +1 씩해가며 모든 종류를 곱해준다. 

최종적으로 구해진 값에 -1 (전부없는경우)을 한다.

 

[https://tallman.tistory.com/7] 발췌

'algorithm' 카테고리의 다른 글

[프로그래머스]멀쩡한 사각형  (0) 2020.03.01
[프로그래머스]기능개발  (0) 2020.01.12
[프로그래머스]프린터  (0) 2020.01.02
[프로그래머스][1차]비밀지도  (0) 2019.12.23
[프로그래머스][1차]다트게임  (0) 2019.12.22