프로그래머스/Lv1

[프로그래머스/Javascript] Lv.1 체육복

woo.oing 2026. 1. 28. 10:45

https://school.programmers.co.kr/learn/courses/30/lessons/42862

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

✓ 풀이과정

 

1. 포함 여부 및 삭제를 쉽게 사용하기 위해 lost와 reserve를 Set으로 변환해서 저장

2. 체육복을 도난당한 학생 번호(lostIndex)를 순회하며 해당 번호(i)가 여벌 체육복이 있는 학생 번호(reserveIndex)에도 있는 번호라면 여벌 체육복을 보유했지만 도난 당한 학생이기 때문에 본인의 체육복 한벌만 보유하고 있는 학생이므로 lostIndex와 reservIndex에서 제거

3. 체육복을 도난당한 학생 번호(lostIndex)를 순회하며 아래 조건 체크

    3-1. 만약 해당 번호(i)가 여벌 체육복이 있는 학생 번호의 뒷번호라면 체육복을 빌린 후 lostIndex에서 제거, 체육복을 빌려준 학생도 여벌 체육복을 빌려주었기 때문에 reservIndex에서 제거

    3-2. 만약 해당 번호(i)가 여벌 체육복이 있는 학생 번호의 앞번호라면 체육복을 빌린 후 lostIndex에서 제거, 체육복을 빌려준 학생도 여벌 체육복을 빌려주었기 때문에 reservIndex에서 제거

4. 전체 학생수에서(n) 체육복을 빌리지 못한 학생수(lostIndex.size)를 제외하고 남은 학생수가 체육수업을 들을 수 있는 학생 수

 

 

일부 테스트에서 실패할 때 아래 확인

 

- 반례 케이스

n lost reserve 올바른 return
5 [2, 3] [3, 4] 4

 

- 학생 번호(lostIndex, reserveIndex)가 정렬되어 있어야 한다는 것

- 체육복을 도난당한 학생 번호(lostIndex)와 여벌 체육복이 있는 학생 번호(reserveIndex) 중복은 미리 제거되어야 한다는 것

 

 

 최종코드

function solution(n, lost, reserve) {
  let lostIndex = new Set(lost.sort());
  let reserveIndex = new Set(reserve.sort());

  for (const i of lostIndex) {
    if (reserveIndex.has(i)) {
      reserveIndex.delete(i);
      lostIndex.delete(i);
    }
  }

  for (const i of lostIndex) {
    if (reserveIndex.has(i - 1)) {
      reserveIndex.delete(i - 1);
      lostIndex.delete(i);
    } else if (reserveIndex.has(i + 1)) {
      reserveIndex.delete(i + 1);
      lostIndex.delete(i);
    }
  }

  return (n -= lostIndex.size);
}