일기

(JavaScript) 체육복

Realuda72 2024. 12. 10. 09:40

여벌의 체육복을 가진 학생이 체육복을 도둑맞은 학생에게 체육복을 빌려주는 문제.

 

먼저 실제로 학생들이 체육복을 몇 벌 가지고 있는지를 배열로 나타낸다. n의 크기가 2 이상 30 이하라서 메모리 공간을 많이 차지하지 않을거라는 생각.

function solution(n, lost, reserve) {
    var answer = 0;
    var student = new Array(n).fill(1); // 모든 학생의 체육복 갯수를 1로 초기화한다.
    for(e of lost){ // 체육복을 잃어버린 학생은 -1
        student[e-1]--;
    }
    for(e of reserve){ // 체육복 여벌이 있는 학생은 +1
        student[e-1]++;
    }
}

 

다음은 학생들을 앞번호부터 순회하며, 체육복 여벌이 있다면 앞뒤 학생에게 빌려준다.

 

만약 체육복이 있다면 체육복 갯수+1

체육복이 없다면 일단 건너뛴다.

체육복 여벌이 있다면 앞뒤 학생에게 빌려주고, 앞 학생에게 빌려줬다면 +2, 뒤 학생에게 빌려줬다면 +1

(앞 학생은 이미 갯수를 세고 지나갔기 때문에 다시 세주어야 하고, 뒤 학생은 다음에 셀 것이기 때문에 괜찮다)

function solution(n, lost, reserve) {
    var answer = 0;
    var student = new Array(n).fill(1);
    for(e of lost){
        student[e-1]--;
    }
    for(e of reserve){
        student[e-1]++;
    }
    for(i in student){
        if(student[i] === 1){
            answer++;
        }else if(student[i] === 2){
            if(student[i-1] === 0){
                student[i-1] = 1;
                student[i] = 1;
                answer += 2;
            }else if(student[i+1] === 0){
                student[i+1] = 1;
                student[i] = 1;
                answer += 1;
            }else{
                answer++;
            }
        }
    }
    return answer;
}

 

==> 자꾸 틀린다.

 테스트 케이스 4, [2, 4], [1, 3] 을 넣어봤는데, 기대값 4가 아닌 3이 나온다.

 뭔가 문제가 있어서 디버거를 돌려보니, for(i in student)에서 문제가 발생했다.

 i를 0, 1, 2, 3으로 순회하는게 아니라, '0', '1', '2', '3'... 문자열로 순회하고 있었다.

(문제가 되는 테스트 케이스를 찾는데 한참 걸렸다... 거지같은 자바스크립트;;; 다른건 왜 되는데;;;)

 

for ... of 문은 배열의 내용을, for ... in 문은 배열의 인덱스를 반환한다고 알고 있었는데, 그게 아닌 모양이었다.

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for...in

 

for...in - JavaScript | MDN

for...in 문은 상속된 열거 가능한 속성들을 포함하여 객체에서 문자열로 키가 지정된 모든 열거 가능한 속성에 대해 반복합니다. (Symbol로 키가 지정된 속성은 무시합니다.)

developer.mozilla.org

for ... in 문에 대한 설명.

for...in 은 상속된 열거 가능한 속성들을 포함하여 객체에서 문자열로 키가 지정된 모든 열거 가능한 속성에 대해 반복합니다.

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for...of

 

for...of - JavaScript | MDN

for...of 명령문은 반복가능한 객체 (Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를

developer.mozilla.org

for ... of 문에 대한 설명

for...of 명령문 반복가능한 객체 (Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성합니다.

 

 즉, for ... in 문은 객체의 key값을 순회하고, for ... of 문은 객체의 value값을 순회한다.

 for ... in 문은 기본적으로 열거 가능한 속성을 가지는 객체에 대해서 수행하는 반복문이기 때문에 Array문에는 사용하지 못한다.

 결국 for ... in 문을 평범한 for(;;)문으로 수정했다.

function solution(n, lost, reserve) {
    var answer = 0;
    var student = new Array(n).fill(1);
    for(e of lost){
        student[e-1]--;
    }
    for(e of reserve){
        student[e-1]++;
    }
    for(i = 0; i < student.length; i++){ // <- 여기
        if(student[i] === 1){
            answer++;
        }else if(student[i] === 2){
            if(student[i-1] === 0){
                student[i-1] = 1;
                student[i] = 1;
                answer += 2;
            }else if(student[i+1] === 0){
                student[i+1] = 1;
                student[i] = 1;
                answer += 1;
            }else{
                answer++;
            }
        }
    }
    return answer;
}

'일기' 카테고리의 다른 글

OSI 모델  (0) 2024.12.10
(JavaScript) 문자열 나누기  (0) 2024.12.10
(JavaScript) 숫자 짝꿍  (0) 2024.12.09
(JavaScript) 옹알이(2)  (0) 2024.12.09
12/5  (0) 2024.12.05