[프로그래머스] 위장

해달·2022년 1월 7일
0


문제이해

  1. 주어진 배열은 [의상의 이름, 의상의 종류] 로 이루어져있다
  2. 같은 이름을 가진 의상은 존재하지 않는다.
  3. 스파이는 하루에 최고 한 개의 의상은 입습니다.
    (아무것도 안입는 경우 X)

[ ["yellowhat", "headgear"], 
  ["bluesunglasses", "eyewear"], 
  ["green_turban", "headgear"] ]

입출력 예시 중 첫번째 배열로 예시를 들어보면
headgear의 수는 A(2) eyewear의 수는 B(1) 라고 가정했을 때
headgeareyewear 의 조합의 경우의 수는 A * B 이다.

이때 A만 착용하고 B를 착용하지 않을 수도 있고,
반대로 B는 착용하고 A를 착용하지 않을 수도 있다.

선택하지 않을 수도 있다는 경우의 수도 추가되기 때문에 주어진 종류의 개수에 1씩 더해준다
(A+1) * (B+1)
그렇게 되면 A와 B를 둘다 착용하지 않는 경우의 수도 1개 추가 된다

주어진 조건에서 스파이는 하루에 최소 한 개의 의상은 입습니다 라는 조건에 의하여
아무것도 입지 않는 경우의 수를 -1 로 빼주어야 한다.

최종 : (A+1) * (B+1) - 1

코드작성

function solution(clothes) {
  let result = 1;
  let obj = {};
  
  clothes.forEach((el) => {
   obj[el[1]] = (obj[el[1]] || 1) +1;
    //[의상의종류] = 개수 더해주기
  })
    
  for(let key in obj){
    result *= obj[key]
  }
    return result-1
}

obj에 처음 값이 추가 될 경우에 주어진 값이 없어 undifined가 들어가게 될 경우에 or 문을 사용하면 1로 선택이 된다
초기값이면 첫번째 경우의 수이기때문에 + 1 (안입는경우) 를 더해준다
만약 이미 값이 할당되어있다면 그 값에 경우의 수를 +1 더 추가해준다

그렇게 구한 의상의 종류의 개수를 for ... in 문을 통하여

구한 경우의 수를 초기에 만들어놓았던 result (1) 변수에 곱해준다

최종적으로 구해진 값에서 -1(아무것도 선택하지 않은경우) 를 빼고 리턴한다.


hash table

위 문제는 hash로 분류되어 있는 문제였는데,
hash table은 key-value 로 주어져있는 자료구조라고 생각한다.

그래서 주어진 [의상의 종류] : 경우의 수 를 object로 생성해서
문제를 푸는 방식이라 생각된다.

hash table은 모든 값을 하나하나 탐색하는것이 아니고
찾고자 하는 값만 정해져 있다면 그 값에 바로 접근 할 수 있어서 문제를 푸는데 시간이 더 적게 소요된다는 장점이 있다.


문제를 푸면서 항상 드는생각이지만 문제가 어떻게 주어졌는지 이해하면
어떤방식을 적용해야 쉽게 풀이할 수 있는지 아는것 같다
아직은 그 스킬이 부족한 것 같아 꾸준히 문제를 풀어가며 이해하는 방법 밖엔 없는거 같다..!


참고한 사이트

(1) 알고리즘 문제 블로그 : https://junghn.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9C%84%EC%9E%A5-%ED%95%B4%EC%8B%9C-1

(2) 노마드코더 hash table 영상
https://www.youtube.com/watch?v=HraOg7W3VAM&t=406s

0개의 댓글