[TIL] 240306 (배열로 입력한 숫자의 합 구하기)

·2024년 3월 6일

TIL

목록 보기
3/268

문제

아래 조건을 만족하는 함수 sumInput()을 작성해 봅시다.

  • prompt 창을 띄워 사용자에게 숫자를 입력해 달라고 요청한 후, 입력받은 값들을 배열에 저장합니다.
  • 숫자가 아닌 값, 혹은 빈 문자열을 입력하거나 ‘Cancel’ 버튼을 누르면 질문을 멈춥니다.
  • 배열 요소의 합을 계산하고 리턴합니다.
    주의: 숫자 0은 유효한 숫자이므로, 사용자가 0을 입력하더라도 질문이 멈추지 말아야 합니다.

function sumInput() {
    
    let numbers = [];
    
    while (true) {
        let value = +prompt('숫자를 입력해 주세요.', 0);
        if (value === null || value === '') break;
        numbers.push(value);
    }
    let sum = 0;
    for (let number of numbers) {
        sum += number;
    }
    return sum;
}

제대로 동작하지 않았다. 숫자가 아닌 값을 입력해도 push가 되었고, break가 되지 않았다.

어떤 어려움이 있었나?

이 문제를 해결하는 데 어렵고 헷갈렸던 부분은 두 가지였다.

  • prompt() 자체에서 숫자로 바꿨을 때, 숫자가 아닌 값들도 숫자로 바뀌어 숫자인지 구분이 불가능했던 점
  • 숫자인지 아닌지를 구분하는 if문 작성에 어려움을 겪었던 점

이 두가지였다. 이 두 문제는 서로 연관된 문제였다.
나중에 numbers에 push를 할 때 +value를 통해 숫자로 바꿔주려 했지만, 그렇게 된다면 prompt에서는 문자열로 받아와지기 때문에 if문에서 숫자인지 아닌지를 판별할 수 없다고 생각했다. 그렇게 하려면 문자열인 상태에서 if문에서 해결을 해야한다는 말인데... 문자열을 어떻게 숫자인지 아닌지 판별할 수 있을까? 라는 고민이 있었다.

어떻게 해결했는가?

몰랐던 개념을 앎으로써 문제를 해결했다.

  • isFinite() : 매개변수가 유한값인지 검사하는 함수. 매개변수가 유한한 숫자이면 true, 무한한 숫자 또는 숫자가 아니면 false를 반환한다.

문자열 내의 숫자라도 유한값인지 검사를 해주기에, 이 함수의 존재를 알고나니 문제 해결이 쉬워졌다. (isNaN 함수도 있으나 Infinity같은 무한한 숫자를 걸러내주지 못한다.) 유한한 숫자일 시 true를 반환하기 때문에, 여기서는 역으로 유한한 숫자이면 false를 반환할 수 있도록 !isFinite()로 변경해주었다. 판별이 해결됐기에 push 시 value를 숫자열로 바꿔주는 것도 가능했다.

function sumInput() {
    
    let numbers = [];
    
    while (true) {
        let value = prompt('숫자를 입력해 주세요.', 0);
        if (value === null || value === '' || !isFinite(value)) break;
        numbers.push(+value);
    }
    let sum = 0;
    for (let number of numbers) {
        sum += number;
    }
    return sum;
}

느낀 점

아직 기본기가 부족하고 모르는 개념들이 많아서, 문제 풀이와 개념 공부를 한 쪽에 치우치지 않고 동시에 철저히 해야한다는 걸 느꼈다.

profile
웹 프론트엔드 개발자

0개의 댓글