코딩테스트 5. 체육복

5. 체육복

체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 한다

  • 여벌이 있어야만 체육복을 빌려줄수 있다
  • 여벌이 있는 학생도 도난당할 수 있다 이경우 체육복을 빌려줄 수 없다
  • 번호는 체격 순으로 바로 앞번호나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있다
function solution(n, lost, reserve) {
  // 중복되는 값을 제거하기 위해 각각 lost와 reserve의 차집합 구하기
  const lost2 = lost.filter(x => !reserve.includes(x));
  // reserve에서 차집합을 구하기위해선 lost의 원본이 변경되면 안되기때문에 새로운 변수생성
  reserve = reserve.filter(x => !lost.includes(x));
  let answer = n - lost2.length;  // 전체 학생수에서 도난당한 학생수 빼기
  let count = 0;

  for (let i = 0; i < reserve.length; i++) {
  // 여벌의 체육복을 가지고 있는 학생수만큼 반복
    if (lost2.indexOf(reserve[i] - 1) !== -1) {
      lost2.splice(lost2.indexOf(reserve[i] - 1), 1);
      count++;
    } else if (lost2.indexOf(reserve[i] + 1) !== -1) {
      lost2.splice(lost2.indexOf(reserve[i] + 1), 1);
      count++;
    }
  }
  return answer + count;
}

// 아래 코드는 테스트를 위한 코드입니다.
const n = 5; // 전체 학생수
let lost = [2, 3, 4]; // 체육복을 도난당한 학생들의 번호
let reserve = [1, 2, 3]; // 여벌의 체육복을 가져온 학생들의 번호
// return 4

console.log(solution(n, lost, reserve));

좋은 웹페이지 즐겨찾기