문제 링크
https://www.acmicpc.net/problem/1065
문제 설명
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다.
등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.
N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
문제 해석
- 등차수열은 항이 넘어갈 때마다 정해진 수 만큼 증가하는 수열이다.
(만약 수열의 각 항이 a1, a2, a3, a4, ... an 이고 각 항마다 d씩 증가할 때,
a1, a1 + d, a1 + 2d, a1 + 3d ... a1 + (n - 1)d 와 같이 증가한다.) - (이때 d는 공차(公差)라고 한다.)
- 한수는 정수 X의 각 자리수가 등차수열을 이루는 수이다.
즉, 정수 X가 111일 경우, 각 자리수는 1, 1, 1 이므로 공차가 0이다. 즉, 일정하게 증감한다고 볼 수 있다. (0씩)
따라서 111은 한수다. - 정수 X가 112일 경우, 각 자리수는 1, 1, 2 이므로 각 자릿수가 일정하게 증가하지 않는다. 따라서 112는 한수가 아니다.
- 만약 두자리 숫자나 한자리 숫자일 경우, 등차수열인지 비교할 수 있는 대상이 없기 때문에 모두 한수로 취급한다.
1 ~ 9까지는 비교대상이 없으며, 10의 자리도 마찬가지로 자릿수를 분해해도 세번째 항이 없는 관계로 비교할 대상이 없다. (문제 이해가 어려웠던 부분이다.)
답안 (set 이용)
const fs = require('fs')
const input = ~~fs.readFileSync('/dev/stdin').toString().trim()
function isHansu(n) {
if (n < 100) return true
const arr = []
while (n !== 0) {
arr.push(n % 10)
n = Math.floor(n / 10)
}
let set = new Set()
for (let i = 0; i < arr.length - 1; i++) {
set.add(arr[i] - arr[i + 1])
}
if (set.size === 1) {
return true
}
return false
}
function solution(input) {
let count = 0
for (let i = 1; i <= input; i++) {
if (isHansu(i)) {
count++
}
}
return count
}
console.log(solution(input))
- 숫자를 인수로 받아 각 자릿수로 잘라낸 뒤 배열에 담아서 계산하는 방법을 택했다.
n의 자리가 10만이 들어와도 계산이 가능한 괜찮은 방법이기 때문이다. - set 자료형을 생성한다.
- 인수의 각 자릿수를 채워넣은 배열이 생성되면 for문이 실행되는데,
각 항의 차를 set 자료형에 추가한다. - set 자료형은 집합 개념으로써 동일한 값을 허용하지 않으므로,
공차가 일정하다면 size는 1개여야 한다. - 따라서, for문의 순회가 끝난 뒤 set의 size가 1이면 한수이고, 아니라면 한수가 아니다.
- 이를 이용하여 solution 함수를 작성한다.
'코테 문제 풀이' 카테고리의 다른 글
[백준 18870] 좌표 압축 (Node.js) (0) | 2023.05.19 |
---|---|
[백준 1193] 분수찾기 (Node.js) (1) | 2023.05.13 |
[백준 4673] 셀프 넘버 (Node.js) (0) | 2023.01.30 |
[백준 3052] 나머지 (Node.js) (0) | 2023.01.27 |
[백준 1000] A + B (Node.js) (0) | 2023.01.13 |