성장에 목마른 코린이

(탐욕법) 체육복 220409 본문

코딩 테스트 준비/프로그래머스 level 1

(탐욕법) 체육복 220409

성장하는 코린이 2022. 4. 9. 03:37
728x90

나의 솔루션

function solution(n, lost, reserve) {
    let ans = 0;
    // n명의 학생만큼 1이 들어있는 배열을 만들어준다.
    let arr = new Array(n).fill(1);
    
    // 체육복이 없으면 1이 들어있던 배열에서 0으로 줄인다.
    for (let i = 0; i < lost.length; i++) {
        arr[lost[i] - 1] -= 1;
    }
    
    // 체육복 여벌이 있으면 1이 있던 배열에서 2로 늘려준다.
    for (let i = 0; i < reserve.length; i++) {
        arr[reserve[i] - 1] += 1;
    }
    
    // 여벌이 있는 학생이 있고, 그 옆에 체육복이 없는 학생이 있다면
    // 여벌이 있는 학생이 체육복이 없는 학생에게 체육복을 준다.
    for (let i = 0; i < n - 1; i++) {
        if (arr[i] === 0 && arr[i+1] === 2 || arr[i] === 2 && arr[i+1] === 0) {
            arr[i] = 1;
            arr[i+1] = 1;
        }
    }
    
    // 체육복이 있는 학생의 수만큼 ans에 +1 해줍니다.
    for (let i = 0; i < n; i++) {
        if (arr[i] >= 1) {
            ans += 1;
        }
    }
    
    // 결과 리턴
    return ans;
}

좋아요가 가장 많이 달린 솔루션

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
}

느낀점

filter와 find를 써서 제가 4개의 for 문을 써서 해결했던걸 정말 간단하게 코드 구현해서 조금 놀랐습니다.

find문은 안써봤어서 한번 공부해야겠습니다!

for 문으로 -1, +1 작업 해주는거 좀 복잡했는데, 앞으로 하다보면 점점 적응되지 않을까 싶습니다!

Comments