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

chooing·2022년 3월 16일
0

프로그래머스

목록 보기
3/4

전체코드

      function solution(n, lost, reserve) {
        reserve.sort((a, b) => a - b);
        lost.sort((a, b) => a - b);
        
        const lostList = [];
        lost.forEach((lostUser, j, arr) => {
          reserve.includes(lostUser)
            ? reserve.splice(reserve.indexOf(lostUser), 1)
            : lostList.push(lostUser);
        });
        
        let borrowUser = 0;
        lostList.forEach((lostUser, j, arr) => {
          if (reserve.includes(lostUser - 1)) {
            reserve.splice(reserve.indexOf(lostUser - 1), 1);
            ++borrowUser;
          } else if (reserve.includes(lostUser + 1)) {
            reserve.splice(reserve.indexOf(lostUser + 1), 1);
            ++borrowUser;
          }
        });

        return n - lostList.length + borrowUser;
      }

문제풀이

1. reserve, lost 내림차순으로 정리한다.

  reserve.sort((a, b) => a - b);
  lost.sort((a, b) => a - b);
  • 전달 받는 배열 reserve, lost 값의 순서가 뒤죽박죽일 수 있으므로 배열을 내림차순으로 정리한다.
  • sort()는 문자의 내림차순으로 정리하기때문에 반드시 (a, b) => a - b 를 적어야 숫자 내림차순으로 정리해 준다.

2. reserve, lost에 동일한 값을 제거한다.

  const lostList = [];
  lost.forEach((lostUser, j, arr) => {
    reserve.includes(lostUser)
    ? reserve.splice(reserve.indexOf(lostUser), 1)
    : lostList.push(lostUser);
  });
  • lostList : 체육복을 도난당하고 여별의 체육복도 없는 학생 배열
  • 아래의 제한 사항이 있으므로 reserve, lost에 동일한 값이 있는지 확인하고 있다면 reserve에 그 값을 지우고 없다면 lostList에 값을 넣는다.

    여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

  • 이 과정을 하면 reserve에는 여벌 체육복이 있고 도난도 안 당한 학생만 남고 lostList에는 체육복을 도난 당하고 여별의 체육복도 없는 학생을 넣을 수 있다.

3. lostList의 각 값을 reserve와 확인한다.

   let borrowUser = 0;
   lostList.forEach((lostUser, j, arr) => {
     if (reserve.includes(lostUser - 1)) {
       reserve.splice(reserve.indexOf(lostUser - 1), 1);
       ++borrowUser;
     } else if (reserve.includes(lostUser + 1)) {
       reserve.splice(reserve.indexOf(lostUser + 1), 1);
       ++borrowUser;
     }
   });
  • borrowUser: 체육복을 빌린 학생
  • 도난 당한 학생 번호(lostUser)는 앞뒤번호 에게만 빌릴 수 있는데,
    -- 먼저 앞번호 학생에게 빌릴 수 있는지 확인하고 => if(reserve.includes(lostUser - 1))
    -- 없다면 뒷번호 학생에게 빌릴 수 있는지 확인한다. => else if (reserve.includes(lostUser + 1))
  • 빌렸다면(조건문이 true일 때)
    -- reserve에서 빌린 학생 번호는 삭제하고 =>reserve.splice()
    -- 빌린 학생 수를 1 증가한다 => ++borrowUser

4. 수업을 들을 수 있는 학생을 return한다.

return n - lostList.length + borrowUser;
  • 위 과정을 끝내고 수업을 들을 수 있는 학생의 수를 return한다.
  • n - lostList.length + borrowUser => 총학생 수 - 도난당한 학생 수 + 빌린 학생 수

여담


날라가서 2번째로 쓰는 여담😂
이번 문제는 풀이 과정은 알 것 같은데 코딩으로 잘 안나와서 여러번 틀렸다...
forEach을 돌리는 배열을 splice하면 forEach가 모든 값을 확인할 수 없으므로 건들면 안된다는걸 깨달았다. 막상 코드를 쓸때는 생각이 안드는데 나중에 보고 나면 당연히 안되는걸 왜 하고 있었지? 걸 깨닫는다.🤦‍♀️🤦‍♂️🤦‍♀️🤦‍♂️

profile
멋찐 프론트엔드 개발자가 되기 위해 공부 중입니다

0개의 댓글

관련 채용 정보