알고리즘

프로그래머스 1단계 탐욕법 후기.

jdy8739 2022. 2. 18. 13:35
function solution(n, lost, reserve) {

    const arr = [];

    for(let i=0; i<lost.length; i++) {
        for(let j=0; j<reserve.length; j++) {
            if(lost[i] == reserve[j]) arr.push(lost[i]);
        }
    }

    console.log(arr);
    // const set = new Set(arr);
    // console.log(set)

    arr.forEach(a => {
        const target1 = lost.findIndex(item => item === a);
        lost.splice(target1, 1);

        const target2 = reserve.findIndex(item => item === a);
        reserve.splice(target2, 1);
    });

    console.log(lost);
    console.log(reserve);

    lost.sort((a, b) => a - b);
    reserve.sort((a, b) => a - b);

    let cnt = 0;
    let x = lost.length;

    for(let j=0; j<lost.length; j++) {

        let a = false;

        for(let k=0; k<reserve.length; k++) {

            if(lost[j] == reserve[k] - 1 || lost[j] == reserve[k] + 1) {
                console.log('??: ' + lost[j] + " " + reserve[k]);
                cnt ++;
                lost.splice(j, 1);
                reserve.splice(k, 1);
                a = true;
                break;
            };
        }
        if(a) j --;
    }

    var answer = n - x + cnt;
    return answer;
}


console.log(solution(5, [3, 1], [2, 4]));
 
 
 
물론 고수분들은 더 간략하게 풀테지만,
 
일단 알고리즘의 90퍼는 완성해놓고 계속 두 테스트 케이스만 오답이 나와서
 
계속 끙끙대다가 결국 혼자서 해결했다.
 
 
 
핵심은 문제를 다시 한번 천천히 읽어보는것이었는데,
 

"" 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요. ""

이 문장이 핵심이었다.

 

 

그냥 해를 구하는걸 넘어서 최댓값을 구해야했으므로

 

lost와 reserve 배열이 순서대로 정렬이 되었어야했다.

 

 

예를 들면 solution 함수를 호출할 때 인자로 

 

5, [1, 3], [2, 4] 요렇게 넣으면 두 배열의 요소들이 모두 서로 상쇄가 된다.

 

 

하지만 5, [3, 1], [2, 4] 이렇게 주어진다면...

 

3이 2를 상쇄하고 남은 1은 4를 상쇄할 수 없기에

 

같은 요소가 들어있는 배열이라도 넣어진 순서에 따라 최댓값이 출력되지않을 수 있었다.

 

 

따라서 두 배열을 sort로 정렬하는 로직을 넣어 해결할 수 있다.