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

잭슨·2024년 2월 11일
0

알고리즘 문제 풀이

목록 보기
124/130
post-thumbnail

문제

[프로그래머스] 체육복

풀이 과정

  1. 학생 수만큼의 크기를 갖는 배열 arr를 만든 뒤 전부 1로 초기화 한다. 해당 배열에 인덱스는 "학생 번호-1" 을 의미하며 값으로는 체육복의 개수를 갖는다.
  2. lostreservearr에 반영해주면 arr 배열에 체육복이 없는 학생은 0, 하나만 있는 학생은 1, 여벌까지 있는 학생은 2라는 값을 갖게 될 것이다.
  3. 이제 배열을 순회하며 0을 만났을 때 앞, 뒤에 있는 학생의 체육복 수가 2라면 그 학생에게 체육복을 빌려오도록 해주면 된다.

시행 착오

처음엔 아래 처럼 코드를 작성했더니 83.3/100점이 나와서 무엇이 문제인지 생각해봤다.

function solution(n, lost, reserve) {
    // 각 학생별 체육복 수량 초기화
    const arr = Array(n).fill(1);
    lost.forEach(e=> arr[e-1] -= 1);
    reserve.forEach(e=>arr[e-1] += 1);
    
    // 현재 학생이 채육복이 없다면 뒤,앞 여벌 남는 학생에게 하나 빌리기.
    arr.forEach((e,i)=>{
        if(arr[i] === 0 && arr[i+1] === 2){
            arr[i] += 1;
            arr[i+1] -= 1;
        }
        if(arr[i] === 0 && arr[i-1] === 2) {
            arr[i] += 1;
            arr[i-1] -=1;
        }
    })
    
    return arr.filter(e=>e > 0).length;
}

위 코드는 arr.forEach 문에서 만약 현재 학생이 체육복이 없다면(0이라면) 뒤에 있는 학생(i+1)에게 먼저 빌릴수 있나 확인해보고 그 다음 앞에 있는 학생(i-1)에게 빌릴 수 있나 확인을 한다.
하지만 뒤에 있는 학생과 먼저 비교하면 테스트 케이스가 n=4, lost=[2,4], reserve=[1,3] 일 때 문제가 발생한다.

const arr = Array(n).fill(1);
lost.forEach(e=> arr[e-1] -= 1);
reserve.forEach(e=>arr[e-1] += 1);

n=4, lost=[2,4], reserve=[1,3] 일 때, 결괏값은 4가 나와야 정상이다.
하지만 위 코드가 수행되고 난 뒤에 arr에는 [2,0,2,0]이 저장되고 arr.forEach문까지 수행된 뒤에는 arr = [2,1,1,0] 이 되므로 결괏값은 3이 출력된다.

따라서 현재 학생이 체육복이 없을 경우 앞에 있는 학생에게 먼저 빌릴수 있나 확인하도록 바꾸었다.

코드

function solution(n, lost, reserve) {
    // 각 학생별 체육복 수량 초기화
    const arr = Array(n).fill(1);
    lost.forEach((e) => (arr[e - 1] -= 1));
    reserve.forEach((e) => (arr[e - 1] += 1));

    // 현재 학생이 채육복이 없다면 앞,뒤 여벌 남는 학생에게 하나 빌리기.
    arr.forEach((e, i) => {
        if (arr[i] === 0 && arr[i - 1] === 2) { // 바뀐 부분
            arr[i] += 1;
            arr[i - 1] -= 1;
        }
        if (arr[i] === 0 && arr[i + 1] === 2) { // 바뀐 부분
            arr[i] += 1;
            arr[i + 1] -= 1;
        }
    });

    return arr.filter((e) => e > 0).length;
}
profile
지속적인 성장

0개의 댓글