본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 위장

by StelthPark 2022. 3. 22.

처리조건

풀이

객체를 사용해 for문을 돌리며 동일한 의상의 종류가 객체에 키로 담겨져 있지않다면 value를 1로 { 의상이름 : 1 }를 만들어주고 해당 i번째 의상이름을 +1 올려주게 된다. 여기서 왜 1로 시작하냐면 의상 종류마다 입지않는 경우도 더해야하기 때문이다. 이렇게 만든 checkCloth라는 객체에는 현재 의상과 의상종류가 각각 담기게 된다.

 

객체는 중복된 키를 저장시키지 않는다는 점을 고려했다. 그렇다면 아래처럼 값이 정렬된다.

입지 않는 경우도 더했기 때문에 각 밸류에는 +1이 더 더해져있다.

이제 경우의 수를 구할 것인데 각 의상 종류마다 들어있는 숫자 끼리 더하고 이를 곱한 값을 더해주면 총 경우의 수를 구할 수 있다. 그리고 모두 입지 않는 경우의 수가 현재 같이 계산되어 있으므로 처리조건에 의해 아무것도 안입은 상태는 없으니 -1를 마지막에 해주어야한다.

 

정렬한 객체가 만약 길이가 1이라면 의상종류는 1개로 의상 이름을 더한 갯수를 리턴해주면 되는데 맨 처음에 아무것도 입지않은 상태를 +1해준 상태로 시작했으니 다시 -1을 한 값을 리턴해줘야하며  그외에 길이가 2이상이라면 기존대로 a*b 형태로 계산 한뒤 -1를 하여 아무것도 입지 않은 상태를 빼주고 리턴해주면 된다.

 

처음 풀었을때 생각보다 많은 테스트가 실패했고 고민해보니 옷을 무조건 입었을때만 계산되므로 입지않은 조건들도 들어가야 한다는 생각과 모두 안입을때는 모두를 입었을때에서 경우의 수를 1개 빼주어야한다는 것을 다시 생각해보았다. 또한 꼭 의상종류별로 의상이름 자체를 저장시킬 필요가 없고 갯수만 세어주면 되므로 리턴을 원하는 값이 어떤 것인지 잘생각해보아야한다.

 

function solution(clothes) {
  let checkCloth = new Object();
  for (let i = 0; i < clothes.length; i++) {
    if (Object.keys(checkCloth).includes(clothes[i][1]) === false) {
      checkCloth[[clothes[i][1]]] = 1;
    }
    checkCloth[[clothes[i][1]]] += 1;
  }

  let valueArr = Object.values(checkCloth);
  let sum = 0;
  let multiply = 1;

  if (valueArr.length === 1) {
    sum = valueArr[0] - 1;
    return sum;
  } else {

    multiply = valueArr.reduce((a, c) => {
      return a * c;
    });
  }
  return multiply - 1;
}

 

 

 

댓글