문제
문제가 너무 길어서 링크를 따로 걸겠다.
https://programmers.co.kr/learn/courses/30/lessons/42578
코딩테스트 연습 - 위장
programmers.co.kr
내 풀이 코드
public int solution(String[][] clothes) { //위장
int answer = 1;
Map<String, Integer> m = new HashMap<>(); //부위별로 옷의 갯수를 저장할 HashMap을 생성
for (int i = 0; i < clothes.length; i++) { //부위별로 옷의 갯수를 HashMap에 저장
m.put(clothes[i][1],m.getOrDefault(clothes[i][1],0)+1);
}
for(String x : m.keySet()){ //부위별로 옷의 갯수 +1을 한 값을 다 곱한다.
answer *= m.get(x)+1;
}
return answer-1; //답에서 1을 뺸다.
}
우선 이 문제는 설명이 아주 조금 복잡하게 되어 있어서 그렇지 이해만 하면 아주 쉬운 문제이다.
간단히 말해서 옷을 부위 별로 입을 수도 있고 안 입을 수도 있는데, 옷을 다 벗고 다니지는 않는 조건에서
옷을 입고 다니는 종류를 구하는 문제이다.
그래서 이 문제는 경우의 수로 풀면 간단히 풀 수가 있다.

여기 문제의 예시에서
얼굴에 입을 수 있는 옷의 종류는
동그란 안경, 검정 선글라스, 없음 -> 이렇게 3가지 경우가 있고
상의에 입을 수 있는 옷의 종류는
파란색 티셔츠, 없음 -> 이렇게 2가지 경우가 있다.
그래서 얼굴과 상의만으로 옷을 입을 수 있는 종류의 갯수는 3x2인데 여기서 아무것도 안입는 경우의 수는 제외하면 -1이 되어 5가 된다.
이런 식으로 얼굴, 상의, 하의, 겉옷으로 옷을 입으려면 3x2x2x2 - 1으로 23가지 경우의 수가 나온다.
이 원리를 이용해서 코드를 짜보면
clothes[][]배열에서 clothes[?][0]에는 어떤 옷인지가 담겨져 있고, clothes[?][1]에는 어떤 종류의 옷인지가 담겨져있는데
HashMap을 이용해서 key값에 옷의 종류를 넣고 value값에 그 옷의 종류의 갯수를 넣는다.
Map<String, Integer> m = new HashMap<>(); //부위별로 옷의 갯수를 저장할 HashMap을 생성
for (int i = 0; i < clothes.length; i++) { //부위별로 옷의 갯수를 HashMap에 저장
m.put(clothes[i][1],m.getOrDefault(clothes[i][1],0)+1);
}
근데 여기서 이미 key값이 존재할 수도 있으니 getOrDefault를 사용해서 이미 존재하면 그 value값에 1을 더하는 식으로 value값을 설정해준다.
for(String x : m.keySet()){ //부위별로 옷의 갯수 +1을 한 값을 다 곱한다.
answer *= m.get(x)+1;
}
여기서는 각 key의 value값을 다 곱해서 answer에 넣어주는 것이고 마지막에 return에 -1을 해주면 쉽게 코드를 짜서 답을 구할 수 있다.
'프로그래머스 > Level 2' 카테고리의 다른 글
| [프로그래머스][Level2][Java] 모음사전 (0) | 2022.05.22 |
|---|---|
| [프로그래머스][Level2][Java] 괄호 변환 (0) | 2022.05.17 |
| [프로그래머스][Level2][Java] 튜플 (0) | 2022.04.14 |
| [프로그래머스][Level2][Java] 짝지어 제거하기 (0) | 2022.04.14 |
| [프로그래머스][Level2][Java] 점프와 순간이동 (0) | 2022.04.08 |