1 minute read

문제 이해

체육복이 있어야만 체육 수업을 들을 수 있다. 체육복을 도난당한 학생들이 있고, 여벌의 체육복을 보유한 학생들이 있다. 여벌 체육복을 가진 학생은 바로 앞번호나 바로 뒷번호 학생에게 체육복을 빌려준다. 최대한 많은 학생이 체육 수업을 들을 수 있게 빌려준다면, 최대 몇명이 수업을 들을 수 있는지 구해야 한다.

접근 방법

제한 사항에서 여벌 체육복을 가진 학생도 도난 당한 학생일 수도 있다고 했기 때문에 그 여부먼저 파악을 하고, 진짜 도난 당한 학생 배열을 만들어 주고 앞, 뒤 번호 학생이 도난 당했는지 판별 후 빌려준 뒤, 전체 학생 수에서 도난 당한 학생 수를 빼면 체육복을 가진 총 학생수가 나올 것이라고 생각.

풀이

체육복을 가진 학생이 도난 당한 학생인지 판별, 앞, 뒤 번호 학생이 도난 당한 학생인지 판별하기 위해 각자 for of 반복문을 돌려주고, 마지막에 총 학생 수에서 도난당한 학생 수를 뺐다.

function solution(n, lost, reserve) {
  let lostStd = [];
  reserve.sort();

  for (let el of lost) {
    if (reserve.includes(el)) {
      // 여벌의 체육복을 가진 학생이 도난당한 학생인지
      let rmIdx = reserve.indexOf(el);
      reserve.splice(rmIdx, 1); // 맞다면 여벌의 체육복을 가진 학생 배열에서 빼준다.
    } else {
      lostStd.push(el); // 그게 아니라면 진짜 도난당한 학생 배열에 넣어준다.
    }
  }

  for (let el of reserve) {
    if (lostStd.includes(el - 1)) {
      // 잃어버린 학생이 앞번호 학생이라면
      let rmLost = lostStd.indexOf(el - 1);
      lostStd.splice(rmLost, 1); // 체육복을 빌려준다 (잃어버린 학생에서 삭제)
    } else if (lostStd.includes(el + 1)) {
      // 잃어버린 학생이 뒷번호 학생이라면
      let rmLost = lostStd.indexOf(el + 1);
      lostStd.splice(rmLost, 1); // 체육복을 빌려준다 (잃어버린 학생에서 삭제)
    }
  }
  return n - lostStd.length; // 전체 학생 수에서 남은 잃어버린 학생 수를 빼준다.
}

Updated: