[프로그래머스 lv.2] 위장 by JS
✉ Question
문제 설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름
얼굴 | 동그란 안경, 검정 선글라스
상의 | 파란색 티셔츠
하의 | 청바지
겉옷 | 긴 코트
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
💌 Answer
문제 설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름
얼굴 | 동그란 안경, 검정 선글라스
상의 | 파란색 티셔츠
하의 | 청바지
겉옷 | 긴 코트
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
해시 문제
1️⃣ object를 해시맵으로 사용
1. kinds
배열에 주어진 옷 종류를 모두 넣은 후 obj
에 key로 넣으면서 가능한 경우의 수를 value로 둔다(해당 종류의 옷을 전혀 선택하지 않는 경우를 고려해 초기값을 2로 준다).
2. obj
에서 경우의 수를 꺼내 combination
에 곱해주면 가능한 모든 조합의 수가 된다.
3. 문제에서 최소한 1개의 옷은 입는다고 했으므로 옷을 하나도 입지 않는 경우는 제외하고 answer
를 리턴한다.
function solution(clothes) {
let answer = 0;
let combination = 1;
let kinds = [];
for(let i = 0; i < clothes.length; i++) {
kinds.push(clothes[i][1]);
}
let obj = kinds.reduce((cnt, element) => {
if(cnt[element]) {
cnt[element] += 1;
}else {
cnt[element] = 2;
}
return cnt;
}, {});
for(let key in obj) {
combination *= obj[key];
}
answer = combination - 1;
return answer;
}
2️⃣ Map으로 해시 만들기
map
에 종류를 key로, 경우의 수를 value로 담아준 다음 value들을 꺼내서 combination에 곱해 모든 조합의 수를 구한다. 아무것도 입지 않는 경우는 제외시키고 answer
를 리턴한다.
function solution(clothes) {
let answer = 0;
let combination = 1;
let map = new Map();
for(let i = 0; i < clothes.length; i++) {
if(!map.get(clothes[i][1])) map.set(clothes[i][1], 2);
else map.set(clothes[i][1], map.get(clothes[i][1]) + 1);
}
for(let v of map.values()) {
combination *= v;
}
answer = combination - 1;
return answer;
}
.
.
.
풀이 방법은 같지만 map은 value를 바로 꺼낼 수 있어서 코드가 더 간단해지는 것 같다!
이런 조합 문제는 문제를 풀기전에 제한조건을 꼼꼼히 보고, 방향을 잘 잡는게 중요해서 시간이 꽤나 걸렸다💨
다른 풀이법도 고민해보면 좋을 듯🙄
Author And Source
이 문제에 관하여([프로그래머스 lv.2] 위장 by JS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@young18/프로그래머스-lv.2-위장-by-JS저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)