hani:) 2023. 6. 21. 19:23

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

function solution(n, lost, reserve) {
    // 1) 서로에게 중복되는 값 제거, 테스트 데이터에서 lost와 reserve에 중복 되는 경우 존재 
    let losts = lost.filter((a) => !reserve.includes(a));
    let reserves = reserve.filter((a) => !lost.includes(a) );
    
    // 2) 갑 정렬, 테스트 데이터에서 정렬되어 있지 않은 데이터 존재
    losts.sort((a, b) => a-b);
    
    // 3) 체육수업을 들을 수 있는 학생의 최댓값 저장할 변수 = 전체 학생수 - 잃어버린 학생 수로 초기화
    let cnt = n - losts.length; 
    
    // 4) for of문 사용하여 배열의 모든 원소에 접근
    for (l of losts) {
        if (reserves.includes(l-1)) { // 4-1) 앞 번호 학생이 여유분이 있는지 확인
            reserves = reserves.filter((a) => a !== l-1); // 빌려준 학생은 여유분을 관리하는 배열에서 제거
            cnt++; // 증감
        } else if (reserves.includes(l+1)) { // 4-2) 뒷 번호 학생이 여유분이 있는지 확인
            reserves = reserves.filter((a) => a !== l+1);
            cnt++;
        }
    }
    return cnt;
}

 

참고

진짜 이 문제 푸는데 너무 힘들었다.. 

빠르게 풀고 제출했는데 에러가 발생해서 로직이 잘못된 건지 계속 봤는데 이상한 점을 찾을 수 없었는데

검색해보니 lost와 reserve에 중복된 번호가 저장된 테스트 데이터가 있다는 것이다.

(이것도 이상해.. 왜 잃어버린 학생이 여유분이 있는거지...? 그럼 잃버린게 아니잖아...!)

728x90