Programmers - 해시 > 위장

박재현·2021년 6월 20일
0

알고리즘 부수기

목록 보기
4/43
post-thumbnail

내 풀이

object에 대한 api에 대해 잘 정립이 되어있지 않아 처음 로직을 짤 때 애먹었다. 특히 한 key값에 value를 2개 이상 넣어주려다 보니 배열 형태로 들어가는 상황이 발생했다.

그리고 마지막 값을 도출할 때도 계산을 잘못하여 시간이 걸렸다.

  1. clothesObj에 각각의 key 값에 대한 요소를 array형태로 넣는다.
    1-1. key값이 이미 clothesObj 안에 존재하면 해당 key 값에 value를 추가한다.
    1-2. key값이 clothesObj 안에 존재하지 않으면 clothesObj에 {key : [value]}를 추가한다.
  2. 각 key값에 해당하는 배열의 길이 + 1을 각각 곱한 뒤 전체에서 1을 뺀다.
function solution(clothes) {
  let answer = 1;
  let clothesObj = {};  // key 값에 따라 배열형태의 value가 들어가는 object
  let cnt = [];  // 각 key값의 배열길이
  for (let i = 0; i < clothes.length; i++) {
    let clothesObjKeys = Object.keys(clothesObj);
    let findKey = clothesObjKeys.find((key) => key == clothes[i][1]);

    //key값이 존재하면 배열에 value를 집어넣고 없으면 {key: [value]}를 clothesObj에 집어넣는다.
    if (findKey === undefined) {
      clothesObj[`${clothes[i][1]}`] = [`${clothes[i][0]}`];
    } else {
      clothesObj[`${clothes[i][1]}`].push(clothes[i][0]);
    }
  }

  for (let key in clothesObj) {
    cnt.push(clothesObj[key].length);
  }
  if (cnt.length === 1) {
    answer = cnt[0];
    return answer;
  }
  for (let j = 0; j < cnt.length; j++) {  // 계산
    answer *= cnt[j] + 1;
  }
  return answer - 1;
}

모범 답안-1

  1. {}로 시작하는 obj에 현재 key값이 존재하면 key값의 value를 +1하고, 존재하지 않으면 {key: 1}을 집어넣는다. 그러고나서 바뀐 object를 obj에 집어넣어 clothes 배열 끝까지 반복한다.
  2. obj의 value값들만 배열 형태로 재생성한다.
    3.해당 value값에 각각 1을 더한 뒤 곱하고 전체 값에서 1을 빼서 결과값을 도출한다.
function solution(clothes) {
  return (
    Object.values(
      clothes.reduce((obj, t) => {
        obj[t[1]] = obj[t[1]] ? obj[t[1]] + 1 : 1;
        return obj;
      }, {})
    ).reduce((a, b) => a * (b + 1), 1) - 1
  );
}

내 풀이와 차이점

  1. 체이닝을 사용하였다.
  2. array api인 reduce와 Object api인 values를 적절히 활용하였다.
  3. key에 해당하는 모든 값들을 배열형태로 push한 내 풀이와는 다르게 key값에 해당하는 값의 개수를 value로 사용하였다.

모범답안-2

  1. obj[arr[1]] || 0 을 이용해 key에 해당하는 값이 obj에 없으면 undefined를 0으로 바꿔 반환하고 있을 경우 기존 value에 +1을 한다.
  2. 이 후 풀이는 위와 같다.
function solution(clothes) {
    let answer = 1;
    const obj = {};
    for(let arr of clothes) {
        obj[arr[1]] = (obj[arr[1]] || 0) + 1;
    }

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

    return answer - 1;
}

내 풀이와 차이점

  1. obj[arr[1]] || 0 을 사용하여 obj[arr[1]]가 undefined일 경우 0으로 초기화해준다.

얻어갈 부분

  • array api, object api를 사용하는 것에 능숙해질 것 (Object.values .keys .entries, array.reduce)
  • 체이닝을 잘 활용할 것
  • 필요한 것이 무엇인지 먼저 파악하고 로직을 고안할 것 (value를 전부 string으로 넣어야되는지, 개수만 넣어도 되는지)
profile
공동의 성장을 추구하는 개발자

0개의 댓글