본문 바로가기
Algorithm

[프로그래머스] 위장 | JavaScript

by Vintz 2021. 8. 17.
반응형

문제 풀이

  • 같은 이름을 가진 의상은 존재하지 않습니다. 

-> 의상 이름 중복 X, 의상 종류 포커스

  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

-> 의상을 모두 입지 않을 경우를 제외하자

예제 1번

clothes return
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]] 5

예제 1번처럼 입을 수 있는 2가지의 의상 종류(headgear, eyewear)가 있다고 가정해보자. 풀이를 할 때 다음과 같은 경우를 고려해야한다.

  1. 해당 종류의 옷을 입지 않고 다른 종류의 옷을 입은 경우 - 기본값 1
  2. 해당 종류의 옷을 입었을 경우 - 값 +1 올리기
  3. 해당 종류의 다른 옷을 입었을 경우 - 값 + 1 올리기

위 사항을 고려해서 코드로 풀이하면 다음과 같다.

let obj = {};

for(let i = 0; i < clothes.length; i++) {
    obj[clothes[i][1]] = (obj[clothes[i][1]] || 1) + 1;
}
  • 빈 객체(obj)를 생성한다.
  • clothes 배열을 돌면서 의상의 종류를 key로, 의상 종류에 포함되는 옷의 개수를 value로 하는 프로퍼티를 obj에 할당한다.
  • 1번처럼 해당 종류의 옷을 입지 않았을 경우, 기본 값을 1로 한다. (obj[clothes[i][1]]가 undefined일 경우 1)
  • 2, 3번처럼 해당 종류의 옷(또는 해당 종류의 다른 옷)을 입으면 value를 +1씩 올려준다.

다음으로 의상 종류의 개수만큼 모든 경우의 수(value)를 곱해준다.

for(let key in obj) {
    answer *= obj[key];
}

return answer - 1;

위 return answer - 1;에서 -1을 해준 이유는 의상을 모두 입지 않은 경우를 제외한 것이다.

코드

function solution(clothes) {
    let answer = 1;
    let obj = {};
    const len = clothes.length;
    
    for(let i = 0; i < len; i++) {
        obj[clothes[i][1]] = (obj[clothes[i][1]] || 1) + 1;
    }    
    
    for(let key in obj) {
        answer *= obj[key];
    }
    
    return answer - 1;
}

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

 

코딩테스트 연습 - 위장

 

programmers.co.kr

반응형