[프로그래머스] 체육복 (JS)

hhkim·2023년 7월 12일
0

Algorithm - JavaScript

목록 보기
63/188
post-thumbnail

풀이 과정

  1. Map을 생성하고 key를 번호로, value를 체육복 수로 함: new Map(), set()
    이때 각각 체육복을 하나씩 가지고 있다고 설정
  2. lost 배열을 돌면서 해당 번호의 학생은 체육복 수 0: get(), set()
  3. reserve 배열을 돌면서 해당 번호의 학생은 체육복 수 +1: get(), set()
  4. reserve 배열을 돌면서 체육복을 2개 갖고 있고 앞 번호가 하나도 갖고 있지 않은 경우 하나 주기: get(), set()
  5. 3을 뒷번호에 대해서도 실행
  6. 체육복 수가 1개 이상인 학생 수 세기: 배열 변환 후 filter()

코드

function solution(n, lost, reserve) {
  const map = new Map();
  for (let i = 1; i <= n; ++i) map.set(i, 1);
  lost.sort();
  reserve.sort();
  lost.forEach((n) => map.set(n, 0));
  reserve.forEach((n) => map.set(n, map.get(n) + 1));
  reserve.forEach((n) => {
    const mine = map.get(n);
    if (mine < 2) return;
    if (map.get(n - 1) === 0) map.set(n - 1, 1);
    else if (map.get(n + 1) === 0) map.set(n + 1, 1);
    map.set(n, 1);
  });
  return [...map].filter((arr) => arr[1] === 1).length;
}

🦾

2차원 배열 대신 맵을 써봤더니 훨씬 깔끔하고 좋다 굿~~
테케 18, 20번이 자꾸 통과가 안 돼서 힌트를 봤더니 정렬을 해야 했다.
이 이유를 찾는 게 오래 걸렸는데, 예외 케이스는 아래와 같은 경우가 되겠다.

  • lost가 [2, 4]고 reserve가 [3, 1]인 경우 결과값은 5명이어야 한다.
  • 근데 내 풀이에서는 reserve 배열을 순서대로 돌면서 앞 번호에 먼저 나눠주니까 3번이 먼저 2번에게 체육복을 준다.
  • 1번은 2번에게 더이상 체육복을 줄 필요가 없다.
  • 4번은 누구에게도 체육복을 받을 수 없다.

사실 이 문제는 한 4년 전에 자바로 풀어본 기억이 있다. 회사 동기들이랑 같이 풀어서 기억이 남..ㅎㅎㅎ (물론 어떻게 푸는지는 까먹었지만)
그때는 코테를 하나도 모르고 푸느라 한참 걸렸던 것 같은데 지금은 30분도 안 걸린 걸 보니 그동안 성장하긴 했구나 싶다.

0개의 댓글