개발저장소
[프로그래머스 Level 2] 의상 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42578
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
- 각 종류별로 최대 하나의 의상만 입을 수 있다. 예를 들어 얼굴에 해당하는 부위에 안경과 선글라스를 모두 착용하는 것은 불가능하다.
- 착용한 의상이 일부 겹치더라도 다른 의상이 겹치지 않거나 추가된다면 다른 옷을 착용한 것으로 한다.
- 최소 하나의 의상은 입게 된다. 즉, 아무 것도 입지 않는 경우를 제외하고 모든 경우를 구해야 한다.
각 종류의 의상 개수를 구해야 한다. 의상 종류를 String 자료형의 key로 가지고, 개수를 Integer 자료형의 value로 가지는 HashMap 자료구조를 만들어 풀었다.
HashMap<String, Integer> map = new HashMap<>();
clothes 배열을 탐색하며 처음 map에 입력한다면 put, 이미 존재한다면 containsKey로 확인 후 replace 해준다.
for(int i = 0; i < clothes.length; i++){
String type = clothes[i][1];
if(map.containsKey(type)){
map.replace(type, map.get(type) + 1);
} else {
map.put(type, 1);
}
}
마지막 조건에서 최소 하나의 옷은 입게 된다는 것은 모든 경우의 수에서 옷을 입지 않은 경우만 빼면 된다.
각 종류의 의상 개수에 입지 않은 경우를 포함하여 계산한 후 아무 것도 입지 않은 경우인 1을 뺀다.
for(String key : map.keySet()){
answer *= ( map.get(key) + 1 );
}
전체 코드 (Java)
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
HashMap<String, Integer> map = new HashMap<>();
for(int i = 0; i < clothes.length; i++){
String type = clothes[i][1];
if(map.containsKey(type)){
map.replace(type, map.get(type) + 1);
} else {
map.put(type, 1);
}
}
System.out.println(map);
int answer = 1;
for(String key : map.keySet()){
answer *= ( map.get(key) + 1 );
}
return answer - 1;
}
}
후기
전체 경우의 수에서 1을 빼는 연산을 빠르게 생각하지 못해서 오래 걸렸다. 또 keySet() 또는 entrySet()을 다시 공부하며 Map을 다루는 법에 익숙해졌다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스 Level 2] 소수 찾기 (0) | 2023.11.17 |
---|---|
[프로그래머스 Level 3] 여행경로 (0) | 2023.11.13 |
[프로그래머스 Level 2] 게임 맵 최단거리 (0) | 2023.11.03 |
[프로그래머스 Level 2] 타겟 넘버 (0) | 2023.11.02 |
[프로그래머스 Level 2] 주식가격 (0) | 2023.11.02 |