programmers

[Programmers Level 1 탐욕법] 체육복 Javascript

냠냠맨 2022. 12. 16. 09:54

⚡문제정보

 

 

모든 학생들은 체육복을 가지고 있습니다.

근데 체육복을 도둑맞은 사람이 있고

여벌체육복이 한벌 더 있는 사람도 있어요

 

빌려주는 걸 통해서 가장 많은 학생이 체육복을 입을 수 있게 해주면 되는데

체육복은 앞뒤로만 빌려줄 수 있다고합니다.

 

또 여벌을 갖고있는 애도 도둑을 맞을 수 있어요

근데 딱 한벌만 훔쳐가는 거 보면 도둑도 최소한의 양심은 있네요


 

🙄입출력 예

 

 


 

 

🔍접근방법

 

여벌을 가지고 있는 녀석과

도둑 맞은 녀석들을 정리해주는게 중요하다고 생각했습니다.

앞뒤로만 빌려줄 수 있으니 체육복이 없는 녀석 근처에 체육복이 2벌인 녀석이 있으면

빌려줄수 있도록 코드를 짰습니다.

 


 

 

🔍나의 풀이

 

function solution(n, lost, reserve) {
    let arr = new Array(n).fill(1)
    for(i=0 ; i < Math.max(lost.length,reserve.length) ; i++ ) {
        arr[ lost[i] -1 ]--
        arr[ reserve[i] -1 ]++
    }
    
    for(i=0 ; i < arr.length ; i++) {
        if(arr[i] == 2 && arr[i-1] ==0) {
            arr[i]--;
            arr[i-1]++
        }
        
        else if(arr[i] == 2 && arr[i+1] == 0 ) {
           arr[i]--;
           arr[i+1]++;
        }

    }
    return arr.filter(ele => ele!=0).length
}

 

풀이 방법은 아래에 서술합니다.

 

function solution(n, lost, reserve) {
    let arr = new Array(n).fill(1)
    // 1로 채워진 배열을 만들어줍니다. 모든 학생은 체육복을 갖고있었으니까요
    
    for(i=0 ; i < Math.max(lost.length,reserve.length) ; i++ ) {
        arr[ lost[i] -1 ]--
        // 체육복 잃어버린 놈들은 0으로 만들어줍니다.
        arr[ reserve[i] -1 ]++
        // 체육복 여벌있는 놈들은 2로 만들어줍니다.
    }
    
    for(i=0 ; i < arr.length ; i++) {
        if(arr[i] == 2 && arr[i-1] ==0) {
            arr[i]--;
            arr[i-1]++
            //만약 i가 여벌이 있고 i-1이 체육복이 없다면 빌려줍니다.
        }
        
        else if(arr[i] == 2 && arr[i+1] == 0 ) {
           arr[i]--;
           arr[i+1]++;
           //만약 i가 여벌이 있고 i+1이 체육복이 없다면 빌려줍니다.
        }
    //-1인 애들부터 빌려주지 않으면 오류가발생합니다.
    }
    return arr.filter(ele => ele!=0).length
    //체육복을 갖고있는애들로만 배열을 재구성해주고 길이를 재줍니다.
}

 

반응형