몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 의상 {언어 : JavaScript} 본문

알고리즘

프로그래머스 [Lv. 2] 의상 {언어 : JavaScript}

스위태니 2024. 3. 9. 21:28

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

function solution(clothes) {
    const clothesDict = {}
    clothes.forEach(([clothesName, clothesType]) => {
        if (clothesDict[clothesType] !== undefined) {
            clothesDict[clothesType].push(clothesName)
        } else {
            clothesDict[clothesType] = [clothesName]
        }
    })
    const clothesLengthes = Object.values(clothesDict).map((e) => e.length)
    const answer = clothesLengthes.reduce((res, e) => {
        return res * (e + 1)
    }, 1)
    return answer - 1;
}

풀이 방법

  1. 반복문을 통해서 clothesDict에 clothesType이 있는지 확인한다.
    1. 있으면 push
    2. 없으면 새로 key(종류) value(의상) 값으로 딕셔너리에 추가
  2. clothesDict의 value값만 가져와서 길이를 구한뒤 새로 mapping 해준다.
  3. 길이를 reduce (콜백함수)를 통해서 곱한다.

왜 res * (e + 1)일까?

  모자 상의 하의 신발
의류 썬캡, 캡모자, 힙합모자 맨투맨, 카라티, 목폴라 청바지, 일자바지 구두, 단화, 운동화
개수 3 3 2 3
선택하지 않음 더하기 3 + 1 = 4 3 + 1 = 4 2 + 1 = 3 3 + 1 = 4

 

모자만 먼저 예를 들면

  • 썬캡을 선택했을 때
  • 캡모자를 선택했을 때
  • 힙합모자를 선택했을 때
  • 선택하지 않았을 때

이렇게 총 4개가 된다.

 

그럼 왜 answer - 1일까?

  • 모자, 상의, 하의, 신발 모두 선택하지 않았을 경우 = 1 이기때문이다.
  • 문제에서 알 수 있듯이 하나는 꼭 입어야 하므로 빼줘야 한다.

따라서 결과는 4 * 4 * 3 * 4 - 1 = 191

느낀점

  • 코딩을 잘하려면 수학도 잘하는 것이 좋다.