자바스크립트 코딩테스트

프로그래머스 Level 1 - 체육복 (Javascript)

준벨롭 2023. 11. 17. 15:01

문제

내 답안 (테스트 케이스에서 틀림)

function solution(n, lost, reserve) {
	var answer = 0;
    let rL = lost.filter((l)=>!reserve.includes(l));
    let rR = reserve.filter((r)=>!lost.includes(r));
    let stu = n - rL.length;
    lost.sort();
    
        for(let i = 0; i < rL.length; i++){
        for(let j = 0; j < rR.length; j++){
            if(rL[i]+1 == rR[j]){
                stu++;
                rR.splice(rR.indexOf(rR[j]),1,"");
                rL.splice(rL.indexOf(rL[i]),1,"");
            }
            else if(rL[i]-1 == rR[j]){
                stu++;
                rR.splice(rR.indexOf(rR[j]),1,"");
                rL.splice(rL.indexOf(rL[i]),1,"");
            }
        }
    }
    
    
    
    return n-rL.length+rL.filter(a=>a=="").length;

참고답안

function solution(n, lost, reserve) {
    let answer = 0;
    
    // n의 갯수만큼 1이 들어있는 hasUniform 배열을 만든다.
    let hasUniform = new Array(n).fill(1);
    
    // hasUniform 배열에서 체육복을 잃어버린 학생의 배열에 1을 빼줘서 0으로 만든다.
    for(let i = 0; i < lost.length; i++){
        hasUniform[lost[i]-1]--;
    }
    
    // hasUniform 배열에서 체육복 여분이 있는 학생의 배열에 1을 더해줘서 2를 만든다.
    for(let i = 0; i < reserve.length; i++){
        hasUniform[reserve[i]-1]++;
    }
    
    // hasUniform의 i에 있는 값이 0이고,
    // hasUniform의 i-1에 있는 값이 2면, i-1에 1을 빼준다. (체육복을 빌려줌)
    // hasUniform의 i에 있는 값인 0에 1을 더해준다. (체육복을 빌림)
    // else if에서는 i+1에 있는 값이 2면 i+1에서 1을 빼준다.
    // i값에 1을 더해준다.
    for(let i = 0; i < hasUniform.length; i++){
        if(hasUniform[i]==0){
            if(hasUniform[i-1]==2){
                hasUniform[i-1]--;
                hasUniform[i]++;
            } else if(hasUniform[i+1]==2){
                hasUniform[i+1]--;
                hasUniform[i]++;
            }
        }
        
        // hasUniform의 i값이 1 이상이면 answer를 더해준다.
        if(hasUniform[i] >= 1){
            answer++;
        }
    }
    
    
    return answer;
}

후기

splice를 사용하면 반복문이 제대로 동작하지 않은 경우가 있다는 것을 알았다.

다양한 메서드, 객체를 이용한 풀이들이 점점 많아지고 있다.

for문만을 이용해서 푸는것보단 다른 방법을 이용해서 풀어봐야할듯..

728x90