본문 바로가기

프로그래머스/JavaScript

[프로그래머스 JavaScript] Level1 체육복

논리 NOT(  ) 연산자는  true 값을  false 로 변환

 

false 으로 변환할 수 있는 표현

  • null
  • NaN
  • 0
  • 빈 문자열 ("", '', ``)
  • undefined

위의 표현을 제외한 나머지는 true

!true         // false
!-1           // false
!"-1"         // false
!35           // false
!"35"         // false
!"cat"        // false
!"true"       // false
!"false"      // false
!{}           // false
![]           // false
!function(){} // false

!false        // true
!null         // true
!undefined    // true
!NaN          // true
!0            // true
!""           // true

 

function solution(n, lost, reserve) {
    let answer = 0;
    let unable = 0;
    
    // 수업을 들을 수 없는 사람
    unable = lost.filter(a => { // 잃어버린 사람 중
        const b = reserve.find(r => Math.abs(r-a) <= 1) 
        // 현재 lost학생(a)이 여벌을 가진 학생중 빌릴 사람 있는지 확인, Math.abs(r-a) <= 1 앞,뒤 번호인지 확인

        if(!b) { // 빌릴 사람을 못찾은 경우, !undefined는 true이기 때문
            return true;
        }        
        
        reserve = reserve.filter(r => r !== b) // 빌려줄 수 있는 사람이 아닌 사람을 필터링        
    }).length // 빌려줄 수 없는 사람수 확인

    return answer = n - unable; // 전제학생 - 수업이 불가능한 한생
}

이 코드를 채점하게 되면 12번 문제 오류가 나게 된다.

여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다. 

라는 조건에 맞지 않아서 인 것 같다.

 

 

배열을 체육복을 개수로 세팅한 후 해결해 나가는 방식

function solution(n, lost, reserve) {
    let answer = 0;
    let uniform = [];
    
    // 초기 셋팅
    // 체육복을 1번씩 가지고 있음
    for(let i = 0; i < n; i++) {
        uniform[i] = 1;
    }
    // 도난당한 사람은 체육복이 0개
    for(let i = 0; i < lost.length; i++) {        
        uniform[lost[i]-1] = 0;
    }
    // 여벌을 가지고 있는 사람은 +1개를 해줌, 2개가 아닌 이유는 도난당했는데 여벌있으면 1개니까
    for(let i = 0; i < reserve.length; i++) {
        uniform[reserve[i]-1] += 1;
    }
    
    for(let i = 0; i < n; i++) { // 체육복이 0개일 경우 빌릴수 있는지 확인
        if (uniform[i] == 0 && uniform[i-1] == 2) { // 앞번호 체육복을 빌리는 경우
        	// 한개씩 나눔
            uniform[i-1] = 1; 
            uniform[i] = 1;
        } else if (uniform[i] == 0 && uniform[i+1] == 2) { // 뒷번호 체육복을 빌리는 경우
            // 한개씩 나눔
            uniform[i] = 1;
            uniform[i+1] = 1;
        }
    }
    
    for(let i = 0; i < n; i++) {
        if (uniform[i] > 0) { // 체육복이 1개 이상 가진 경우
            answer++; // 수업 참여 가능 인원 카운트
        }
    }
    
    return answer;
}