SPACE RUMI

Hi, I am rumi. Let's Splattack!

[IT] 프로덕트 개발/Coding Test - 코딩테스트

[LV1] 체육복

백루미 2022. 11. 23. 13:53
반응형

프로그래머스 LV1 > 탐욕법(Greedy) > 체육복

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42862#

[문제해결]
1. 여벌의 체육복을 가져온사람꺼를 훔쳐갔을수도 있다. 두 배열을 비교해 중복을 제거해준다. splice()를 써주되, 원본이 바뀐다는 사실에 유념한다.
2. 두 배열을 정렬해준다.
3. 체육복을 빌려주면 각 array에서 제거한다(filter)
4. 최종적으로 총 인원에서 잃어버린 체육복의 갯수 lost.length를 빼준다.

 

실패한코드

function solution(n, lost, reserve) {
    reserve.forEach((el,i) => {
        if(lost.indexOf(el)!==-1){
            lost.splice(lost.indexOf(el),1);
            reserve.splice(i,1);
        }
    })
     lost.sort((a, b) => a - b);
     reserve.sort((a, b) => a - b);
    let count = n - lost.length;
    
    for(let i=0; i<reserve.length; i++){
        let left = reserve[i] -1;
        let right = reserve[i] + 1;
        for(let j=0; j<lost.length; j++){
            if(lost[j] == left){
                count++
            }
            continue;
            if(lost[j] == right){
                count++
            }
        }
    }
    return count;
}

 

테케는 다 통과했는데 뭐가 문제지 했더니,
1. continue가 if문 바깥에 있어서 아래 if문은 무조건 안타고있었다.
2.중복을 걸러주는것도 reserve를 splice하면서 index가 한칸씩 짧아지는데 원본을 바꾸고있다는걸 인식을 못하고 있었다.

 

수정한코드

function solution(n, lost, reserve) {
    let lostItem = [...lost]
    let reserveItem = [...reserve]
    
    
      for(let i = 0; i < lostItem.length; i++) {
        if(reserveItem.includes(lostItem[i])) {
            let duplicateIdx = reserveItem.indexOf(lostItem[i])
            lostItem.splice(i, 1);
            reserveItem.splice(duplicateIdx, 1);
            i--
        }
    }
    console.log('중복제거후 reserve',reserveItem)
    console.log('중복제거후 lost',lostItem)
    
     lostItem.sort((a, b) => a - b);
     reserveItem.sort((a, b) => a - b);
     

    for(let i=0; i<reserveItem.length; i++){
        for(let j=0; j<lostItem.length; j++){
             let left = reserveItem[i] - 1;
             let right = reserveItem[i] + 1;
            if(lostItem[j] == left){
                lostItem = lostItem.filter(el => el !== lostItem[j])
                reserveItem = reserveItem.filter(el => el !== reserveItem[i])
                j = j-1;
                i = i-1;
                continue;
            }
            
            if(lostItem[j] == right){
                lostItem = lostItem.filter(el => el !== lostItem[j])
                reserveItem = reserveItem.filter(el => el !== reserveItem[i])
                j = j-1;
                i = i-1;
            }
        }
    }
   
    let count = n - lostItem.length; //이 시점에서 체육복이 있는사람 카운팅
    return count;
}

 

좀더 수정할수있을듯한데..
나중에 다시 풀어봐야겠다.

반응형