탐욕법 알고리즘의 - 체육복 문제
문제:
https://programmers.co.kr/learn/courses/30/lessons/42862
처음으로 '탐욕법'이라는 게 알고리즘? 의 하나라는 걸 알았다.
그래서 풀기전에 알아봤는데, 이걸 알면 도움이 되는지는 모르겠다.
아마 내 이해가 부족해서 그런 듯 하다..
문제를 처음 풀고 (몇 시간 걸림 ㅠ-ㅠ lv.1이 너무어려워..)
잘 푼사람 것을 보고 다시 풀어봤다.
(사실 좋아요 높은 풀이에 오류가 있어서 내가 고쳐봤다. 그분스탈을 배워서 ㅎㅎ)
1번째 답
function solution(n, lost, reserve) {
var answer = 0;
for(let i = 0; i < lost.length; i++){
for(let r=0; r<reserve.length; r++){
if(reserve[r] === lost[i]){
reserve[r]= `${Math.random()}`;
lost[i]=`${Math.random()}`;
}else if(reserve[r] === lost[r]){
reserve[r]= `${Math.random()}`;
lost[r]=`${Math.random()}`;
}else if(reserve[i] === lost[r]){
reserve[i]= `${Math.random()}`;
lost[r]= `${Math.random()}`;
}
}
for (let j=0; j<reserve.length; j++){
if(Math.abs(lost[i]-reserve[j]) === 1){
lost[i]=`${Math.random()}`;
reserve[j]=`${Math.random()}`;
break;
}
}
}
for (let s=0; s<lost.length; s++){
((typeof lost[s]) === "number") ? n-=1 :null;
}
answer = n;
return answer;
}
매우 지저분하다. for (let r) 쪽에서 elseif 안하고 if로 세개 했다가 한 문제가 계속 틀려서 고생했다. (생각좀해라)
잘 푸신분을 보니 두눈이 커지며 현타+난 안될놈? 싶었다.
그래도 그분은 12번 케이스가 오류나는 답이라 내가 또 지저분하게 고쳐봤다.
function cutSameNum(ArrToCheck, ArrToCompare) {
ArrToCheck = ArrToCheck.filter(r => {
let b = ArrToCompare.find(e => e === r);
if (b) return false;
return true;
});
return ArrToCheck;
}
function solution(n, lost, reserve) {
let lostData = lost;
let reserveData = reserve;
lost = cutSameNum(lost, reserveData);
reserve = cutSameNum(reserve, lostData);
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
);
}
원래없던 cutSameNum을 만들어서 같은 번호인 아이들을 없애버렸다.
이렇게 안하면 오류가 생긴다.
filter 와 find를 통해 반복문처럼 쓰는 법을 배웠다.
lost와 reserve 모두에서 중복된 값을 빼야해서 따로 data 변수를 만들어 비교하며 삭제했는데, 더 좋은 방법이 없나 싶다.