programmers - 체육복 with JS

@p-iknow 🎹 · September 09, 2019

Problem
Solve
내 풀이
다른 사람 풀이Array.apply(undefined, new Array(n))
다른 사람 풀이 (반례에 실패함)
What I learned
절대값 사용
반례
Array.find(callback)

Problem

프로그래머스 체육복

출저

Solve

내 풀이

const getIndexToDelete = (student, lost) => {
  const prev = lost.indexOf(student - 1);
  if (prev !== -1) return prev;

  const next = lost.indexOf(student + 1);
  if (next !== -1) return next;

  return null;
};

const solution = (n, lost, reserve) => {

  const l = lost.filter(student =>{
    return reserve.indexOf(student) === -1;
  })

  const r = reserve.filter(student => {
    return lost.indexOf(student) === -1
  });

  r.forEach(student => {
    const flag = getIndexToDelete(student, l);
    if (flag !== null) l.splice(flag, 1);
  });
  const answer = n - l.length;
  return answer;
};

다른 사람 풀이Array.apply(undefined, new Array(n))

function solution(n, lost, reserve) {
  const actualReserve = reserve.filter(el => lost.indexOf(el) === -1);
  const actualLost = lost.filter(el => reserve.indexOf(el) === -1);

  const set = Array.apply(undefined, new Array(n)).map((el, i) =>
    actualLost.indexOf(i + 1) === -1 ? true : false
  );

  for (let hero of actualReserve) {
    if (set[hero - 1 - 1] === false) {
      set[hero - 1 - 1] = true;
    } else if (set[hero - 1 + 1] === false) {
      set[hero - 1 + 1] = true;
    }
  }
  console.log(actualReserve, set, set.filter(el => el).length);
  return set.filter(el => el).length;
}

다른 사람 풀이 (반례에 실패함)

// 정답은 6인데, 7이 나온다. 반례에 실패하는 풀이이다. 
solution(7, [2, 3, 4], [1, 2, 3, 6]);

function solution(n, lost, reserve) {
  const answer =
    n -
    lost.filter(a => {
      const b = reserve.find(r => Math.abs(r - a) <= 1);
      if (!b) return true;
      reserve = reserve.filter(r => r !== b);
    }).length;
  return answer;
}

What I learned

절대값 사용

+1 or -1 or === 를 절대값 함수를 통해 표현할 수 있다. 절대값이 1과 같거나, 작다고 표현된다.

 reserve.find(r => Math.abs(r - a) <= 1);

반례

알고리즘 풀 때 지문 상에서 주어지는 한계에 대해 유심히 살핀다. 이번 지문에서는 "여벌 체육복을 가져온 학생이 체육복을 도난당 했을 수 있다" 는 내용이 반례다.

이 반례를 포함하려면 처음 시작할 때 lost, reserve 배열에 같은 숫자를 서로 제거하는 로직이 필요하다.

const l = lost.filter(student =>{
  return reserve.indexOf(student) === -1;
})

const r = reserve.filter(student => {
  return lost.indexOf(student) === -1
});

Array.find(callback)

배열에서 callback 함수의 return 이 true 가 나오는 첫번째 값을 반환한다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

@p-iknow 🎹
많은 것을 이해하고 싶습니다. 더 이해하기 위해 노력합니다.