관리 메뉴

Silver Library (Archived)

백준 1065 한수 - JS 본문

CS Library/JavaScript - Data Structure

백준 1065 한수 - JS

Chesed Kim 2021. 8. 8. 22:27
반응형

한수 문제.

입력: 첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력: 첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

 

 

이 문제를 풀려면 등차수열에 대한 이해가 필요합니다.

"수학에서, 등차수열(等差數列, 문화어: 같은차수렬, 영어: arithmetic progression, AP 또는 arithmetic sequence)은 연속하는 두 항의 차이가 모두 일정한 수열을 뜻한다. ... 예를 들어, 앞의 수열의 공차는 2이다." - wikipedia

 

우선 fs module. 그런데 이렇게 하면 VSCode 상으로는 되지만, 백준에서는 틀렸다고 합니다.

// Initializing
function hanSoo(N) {
    const numArr = [];
    let hanSoo, digitCount;
    let temp = 0;

// for 반복문 / 1부터 N 으로 들어오는 값의 바로 전까지.(즉 100들어오면 -1인셈.) 더하기.
    for (let i = 1; i <= N; i++) {
        // 만약 100 보다 작다면, 그게 한수(hanSoo) 의 i 에 해당된다
        if (i < 100) {
            hanSoo = i;
            // 만약 한수가  1000보다 작다면, digitCount 는 0이되고, temp 는 1이 된다.
        } else if (i < 1000) {
            digitCount = 0;
            temp = 1;
            // temp 가 0 보다 크면; numArr 는 digitCount 를 참고하는데, 여기서 temp 의 나머지 10을 구하고, temp 는 이 나머지 10 값을 string 에서 정수로 변환한다.
            // 그 후, digitCount 는 덧셈으로 반복문이 작동. (temp 가 0보다 크다는 조건하에)
            while (temp > 0) {
                numArr[digitCount] = temp % 10;
                temp = parseInt(temp / 10);
                digitCount++;
            }
            // 아래는 문제에서 제시한 한수가 작동하도록 구성하는 로직이다.
            if (numArr[0] - numArr[1] === numArr[1] - numArr[2]) {
                hanSoo++;
            }
            // 그 이외의 경우, break
        } else {
            break;
        }
    }
// 최종적으로 hanSoo 를 return.
    return hanSoo;
}
// 이제 예제 출력이 나오도록, 예제 입력값인 110 을 입력해보자.
console.log(hanSoo(110));

100 미만의 수는 한수.

for 반복문 내부에서, 100 미만의 값은 한수로서 count 처리.

1000 미만의 경우, 각 자릿수를 분리하여 Array 에 포함.

이 분리한 각 자릿수를, 순서대로 빼낸다. 등차수열을 확인하기 위해.

- 만약 이 값이 한수라면, 한수로서 count. 한수가 아니라면, 등차수열이므로 else {break}; 처리 해서 목표대로 처리.

 

 

그래서, 찾아본 결과.

let readline = require('readline');
let rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', function(line) {
    let n = Number(line);
    
    function x(n) {
        let count = 0;
        for(let i = 1; i <=n; i++) {
            if(i < 100) {
                count++;
            } else {
                i = String(i);
                if(i[0]-i[1] === i[1]-i[2]) {
                    count++;
                }
            }
        }
        return count;
    }
    
    console.log(x(n));
    
}).on('close', function() {
    process.exit();
});

개인적으로는, fs 에서 구성한 방식이 더 편안합니다.

당연하지만 이걸 한번에 이해하는 건 어려우니, 이 점은 주의해야합니다.

 

참고 link 1. link2.