A.P - 체육복 빌려주기(프로그래머스, L1)

EBinY·2022년 8월 29일
0

AP - Algorithm Problem

목록 보기
48/55
  1. 문제
  • 한 반에 체육복 도둑이 들어와 체육복을 훔쳐감
  • 체육복이 없으면 체육 수업에 참여할 수 없음
  • 학급 번호는 체형 크기순으로 메겨져 있음
  • 여벌의 체육복이 있는 학생은 자신의 바로 앞 또는 뒷번호에게만 빌려줄 수 있음
  • 여벌은 최대 1벌을 가질 수 있고, 여벌이 있는 학생 또한 도둑 맞았을 수 있음
  • 체육 수업에 참여할 수 있는 학생의 수를 구하여 리턴하자
  1. 수도코드
// 배열이 비정렬 상태일 경우 앞뒤 순서에서 오류가 생길 수 있으므로, 주어진 배열을 정렬시키고 시작한다
// 여벌을 가진 학생이 분실했을 경우를 파악하여 각 배열에서 제해야 한다
// 분실은 했지만 1벌이 남았으므로, 분실자도 아니고 여벌자도 아니게 되므로 제해야 한다
// 체육복을 빌려줄 때에 앞번호와 뒷번호를 분리해서 계산해야 함
// 두 경우를 묶어서 하면 둘 중 하나를 빌려주게 되지만, 누구를 빌려줬는지를 구분할 수 없음
// 빌려주는 경우 또한 빌려받은 사람과 빌려준 사람을 배열에서 제해야 한다
// 반의 학생에서 체육복이 없는 학생수를 빼고, 빌려입은 학생수를 더하여 리턴하면 될 듯
  1. 결과
function solution(n, lost, reserve) {
    // 배열값을 정렬하고 시작해보자
    lost.sort();
    reserve.sort();
    
    // 여벌을 가진 학생이 분실했는지를 파악하고, 분실값과 여벌수에서 제하자
    for (let i = 0; i < reserve.length; i++) {
      // 분실값에 여분값이 포함되어 있으면
      if (lost.includes(reserve[i])) {
        // 두군데에서 다 빼줘야 계산에 오차가 없음
        // 분실값에서의 인덱스를 조회하고
        let idx = lost.indexOf(reserve[i]);
        // 분실값에서 그 값을 제외
        lost.splice(idx,1);
        // 여분값에서도 제외
        reserve.splice(i, 1);
        i--;
      }
    }
    
    // 결과값을 학생수에서 분실값을 뺀 값으로 설정
    let answer = n - lost.length;
    
    // 여벌값에서 분실값에 빌려주고 빈 배열에 저장하고, 그 배열의 길이만큼 결과값에 더하자
    let sol = [];
    
    // 앞번호와 뒷번호를 빌려줄 때를 가정할 때에, 분리해서 진행해야 함
    // 앞번호에게 빌려주면 뒷번호에게는 빌려줄 없는데, 두 경우를 묶어서 계산하면 중복되어 질 수 있다
    for (let i = 0; i < reserve.length; i++) {
        for (let j = 0; j < lost.length; j++) {
            // 분실값을 여벌값과 비교해 1차이 범위에 들어가면 그 번호를 빼서 해결 배열에 넣고
            // 빌려입은 분실값을 제해야 중복으로 빌리는 것을 방지할 수 있겠다
            if (lost[j] === reserve[i] - 1) {
                sol.push(lost[j]);
                lost.splice(j,1);
                reserve.splice(i,1);
                j--;
                i--;
            } else if (lost[j] === reserve[i] + 1) {
                sol.push(lost[j]);
                lost.splice(j,1);
                reserve.splice(i,1);
                j--;
                i--;
            }
        }
    }
  
    // 총 학생수에서 분실자를 뺀 숫자에, 빌려입은 사람 수를 더하여 리턴하자
    answer = answer + sol.length;
    return answer;
}
  1. 레퍼런스
function solution(n, lost, reserve) {      
    return n - lost.filter(a => {
        const b = reserve.find(r => Math.abs(r-a) <= 1)
        if(!b) return true
        reserve = reserve.filter(r => r !== b)
    }).length
}
  • 레퍼런스를 완벽히 이해하도록 공부해야겠음
  • Math.abs(): 주어진 숫자의 절대값을 반환하는 함수
  1. 레퍼런스 공부 및 분석 주석
function solution(n, lost, reserve) {
    // 총 학생수에서 분실자를 여벌자들과 종합하여
    // 못빌린 사람을 필터링하고, 그 숫자를 뺀 값을 리턴함
    return n - lost.filter(a => {
        // 여벌자인 r이 분실자인 a와 1이 차이가 나는지를 판별
        const b = reserve.find(r => Math.abs(r-a) <= 1)
        // 판별된 사람이 없다면 true를 리턴하여 lost에 남김
        if(!b) return true
        // 판별된 사람은 여벌자에서 제외함
        reserve = reserve.filter(r => r !== b)
    }).length
}

0개의 댓글

관련 채용 정보