알고리즘 문제 풀기

백준 1065: 한수 - javascript(완전탐색)

Fo_rdang 2023. 10. 3. 14:26
반응형

문제 출처 

https://www.acmicpc.net/problem/1065

 

1065번: 한수

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나

www.acmicpc.net

문제

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 

입력

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

출력

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

예제 입력 1 복사

110

예제 출력 1 복사

99

예제 입력 2 복사

1

예제 출력 2 복사

1

예제 입력 3 복사

210

예제 출력 3 복사

105

예제 입력 4 복사

1000

예제 출력 4 복사

144

예제 입력 5 복사

500

예제 출력 5 복사

119

문제 풀이 힌트 

1) 1~99 수는 모두다 한수다. 그래서 N이 그 사이 값이라면 그 값 그대로 return을 해주면 된다.

2) 100 ~999 사이 숫자는 첫번째 숫자와 두번째 숫자의 차이, 두번째 숫자와 세번째 숫자의 차이만 확인해주면 된다. 

   - 99까진 어처피 한수니까 바로 100부터 반복문을 돌려준다. 

3) 1000은 한수가 아니니, 고려할 필요없다. 

정답 풀이 코드 

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
const N = Number(input.shift()); 
function solution(N){
    if(N < 100){
        return N; 
    }
    let answer = 99; 
    for(let i=100; i<=N; i++){
        let number = String(i); 
        let standardA = number[0] - number[1];
        let standardB = number[1] - number[2];  
        if(standardA === standardB) answer++;  
    }
    return answer; 
}
const answer = solution(N); 
console.log(answer);

의사 코드 추가 

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
const N = Number(input.shift()); 
function solution(N){
    if(N < 100){ //100이하의 수라면 그대로 N을 리턴한다. 
        return N; 
    }
    let answer = 99; 
    for(let i=100; i<=N; i++){
        let number = String(i); //문자로 바꿔줘야 숫자 하나하나 접근 가능하다. 
        let standardA = number[0] - number[1]; //첫번째 숫자와 두번째 숫자 차이 비교 
        let standardB = number[1] - number[2]; //두번째 숫자와 세번째 숫자 차이 비교  
        if(standardA === standardB) answer++;  //차이가 같을 때 한수다. 
    }
    return answer; 
}
const answer = solution(N); 
console.log(answer);
반응형