본문 바로가기
ComputerScience/알고리즘, 프로그래머스

[Lv.1] 체육복 (JS 한글변수의 힘)

by VictorMeredith 2023. 2. 2.

1. 문제

2. 전략

 1) 생각보다 복잡하다. 학생은 원래 내꺼만있어서 빌려줄수 없는 경우, 도난당한 경우, 여벌이 있는 경우, 여벌이 있었는데 도난당해서 내꺼만있게 된 경우 총 4가지의 경우가 있는데 이를 변수로 고치다 보면 헷갈려서 조건문 작성이 복잡해지는 경우가 있다.

 2) 그래서 토종 한국인은 역시 영어보단 한국어가 읽기 쉬우므로 한글변수를 적극 활용해보았다. 

 3) 계속 변화하는 state변수의 상황과 변화 상황을 쉽게 관찰하기 위해 console.log를 적극 활용했다.

 4) 당연히 console.log는 빌드 전에 삭제하자.

 5) 당연히 한글변수도 에러의 가능성이 있으므로 ctrl + shift + f 로 전체찾아서 전체 영어변수로 적절히 바꾸어주면 된다.

function solution(n, lost, reserve) {
    var answer = 0;
    
    let state = []; //전체 학생의 현재상황을 학생번호순으로 담을거임
    state.length = n; //전체 학생수
    state.fill('내꺼만있음') // 기본값은 내꺼만있는경우
    
    for(i in lost){ // lost에 있는 학생번호 칸에 맞춰 '도난'이라고 넣는다
        state[lost[i]-1] = '도난'         
    }
    for(j in reserve){ // reserve에 있는 학생 번호 칸에 맞춰 '줄수있음' 이라고 넣는다
        state[reserve[j]-1] = '줄수있음'         
    }
    for(let l =0; l<n; l++){ 
    //reserve에도 있고, lost에도 있는 번호의 학생같은 경우
    //여벌이 있었는데 도난당해서 내꺼만있음 모드로 변경
        if(reserve[l] && lost.includes(reserve[l])){
            state[reserve[l]-1] = '내꺼만있음'
        }
    }
    
    console.log(state)
    for(let k =0; k<state.length; k++){ //메인 로직
    // 1. 1번학생이 줄 수 있을 경우 뒷번호가 도난이면 주고 받는다
    // 2. 맨 마지막 학생이 줄 수 있을 경우 앞번호가 도난이면 주고 받는다.
    // 3. 나머지는 본인 앞번호가 도난이면 주고받고 뒷번호가 도난이면 주고 받는다.
        if(k === 0 && state[k] === '줄수있음' && state[k+1] ==='도난'){
            state[k] = '줬음'
            state[k+1] = '받음'
        }
        else if(k === state.length-1 && state[k-1] !=='도난' && state[k] === '줄수있음'){
            state[k-1] === '받음'
        }
        else if(state[k] === '줄수있음'){
            if(state[k-1] === '도난'){
                state[k-1] = '받음';
                state[k] = '줬음'
            }
            else if(state[k+1] === '도난'){
                state[k+1] = '받음';
                state[k] = '줬음'
            }
            else{
                console.log('남지만 못줌') //줄수는 있지만 옆에가 도난이 아니다
            }
        }
        else{
            console.log('행동을 할 수 없어요')
        }
    }
    console.log(state)
    
    answer = state.filter((e)=>e !== '도난').length; 
    //도난이 아닌경우를 필터링해서 길이를 리턴.

    
    return answer;
}

 

3. 알아야할 사항

   - 한글변수를 활용하면 조금 더 로직 보기가 쉽더라.

댓글