자바칩

[프로그래머스 / Java] 코딩테스트 연습: 의상 (해시) 본문

알고리즘/프로그래머스

[프로그래머스 / Java] 코딩테스트 연습: 의상 (해시)

아기제이 2024. 8. 8. 20:50
728x90

난이도: Level 2

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

저 문제를 보자마자 해시와 백트래킹으로 풀기 시작했다.

하지만 생각보다 안 풀려서 챗지피티한테 물어보니까 정말 간단한 수학 지식인 조합으로 푸는 것이었다.....

또 쓸데없이 너무 어렵게 생각해서 꼬아버린 것이다.

와 나 진짜 사고력 응용력 바닥이구나.......

나는 사실 고등학교 때 수학을 꽤 재미있어했어서 수학 공부에 시간을 많이 들였지만 인풋 대비 아웃풋이 심각하게 나오지 않았다.

알고리즘도 마찬가지인 것 같다. 꽤 재미있으나 투자하는 만큼 결과가 나오지 않는다.

하지만 뭐 어쩌겠나 타고난 사고력이 이런데..... 계속 해야지 뭐.......

 

이 문제의 놀라운 점은 

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

이 배열에서 옷 이름은 전혀 필요가 없던 것이다.

즉 clothes[i][0]의 값은 이 문제에서 쓰이지 않는다.

 

이 배열에서 "headgear"은 2개, "eyewear"은 1개이다.

"headgear" : "yellow_hat", "green_turban"
"eyewear" : "blue_sunglasses"

 

headgear에서는 아무것도 고르지 않거나, yellow_hat를 고르거나, green_turban를 고를 수 있다.

즉, 3가지의 경우의 수가 있다.
eyewear에서는 아무것도 고르지 않거나, blue_sunglasses를 고를 수 있다.

즉, 2가지의 경우의 수가 있다.

 

총 경우의 수는 3 * 2 = 6으로 조합할 수 있다.

그러나 모든 곳에서 아무 것도 고르지 않는 경우(headgear에서도 아무것도 고르지 않고, eyeware에서도 아무것도 고르지 않는 경우)는 제거해야 하므로 6에서 1을 뺀 5가 답이 된다.

 

전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.*;
 
class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;     // 서로 다른 옷의 조합의 수
        Map<String, Integer> counts = new HashMap<>();  // K: 의상의 종류, V: 개수
        
        for (String[] c : clothes) {
            // 의상의 종류와 개수를 맵에 추가
            counts.put(c[1], counts.getOrDefault(c[1], 0+ 1);
        }
        
        // 서로 다른 옷의 조합의 수: 각 의상의 종류 개수 + 1을 모두 곱하기
        for (int count : counts.values()) {
            answer *= count + 1;
        }
        
        // 옷을 아무것도 고르지 않은 경우의 수 1개 제거 후 리턴
        return answer - 1;
    }
}
cs