프로그래머스 lv.1 greedy(탐욕법, 체육복)

KIMMY·2020년 7월 3일
0

코딩테스트연습

목록 보기
5/7

탐욕법 알고리즘의 - 체육복 문제
문제:
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 변수를 만들어 비교하며 삭제했는데, 더 좋은 방법이 없나 싶다.

profile
SO HUMAN

0개의 댓글