알고리즘
프로그래머스 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로 정렬하는 로직을 넣어 해결할 수 있다.