JavaScript 백준 온라인 알고리즘 공부
백준 1065 번 Node.js 문제풀이
const fs = require("fs");
const [n] = (
process.platform === "linux"
? fs.readFileSync("/dev/stdin").toString()
: `1000
`
)
.trim()
.split("\n");
let N = Number(n);
let count = 0;
for (let i = 1; i <= N; i++) {
let nArr = String(i);
if (i < 100) {
count++;
continue;
}
let A = Number(nArr[0]) - Number(nArr[1]);
let B = Number(nArr[1]) - Number(nArr[2]);
if (A === B) {
count++;
}
}
console.log(count);
이번 문제는 지문의 올바른 해석이 아주 중요했다. 1~ 110의 결과에서 1~99는 한수로 인정되는가를 찾는 발상이 없으면 풀기가 너무나 어렵게된다.
우선 "등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다." 조건을 이해해야 한다. 각각 3개의 숫자 사이가 일치되는 것이다. 그럼 1자리 수와 10의자리 수는 연속된 수의 차이가 나오지 않는데 그런 숫자는한수
로 인정되는가가 문제다. 예제출력 1를 보면 1~ 99의 숫자 모두 인정된다는 걸 알 수 있다.
한수
로 인정되는 조건을 바로 생각해보면 123, 135, 147, 159 같은게 한수
일 것 이다.
111, 222, 333은 어떨까? 차이가 0인 것도 서로 똑같으니 일정한 차이라고 볼 수 있다.
그 조건대로 짠다면 문자열로 변환 후 한자리씩 따와서 인접한 숫자끼리 뺄셈한 결과가 같으면 한수
가 나오게 되는 것이다. 그러한 숫자들을 이미 한수
로 인정된 99개의 카운트숫자에 더하면 출력 할 값이 나온다.
1000은 한수가 아니다. 그래도 짜놓은 로직대로면 100을 대조하는거라 굳이 고치지 않아도 예제대로 144가 나온다.
.
.
.
let N = Number(n);
let count = 99;
for (let i = 1; i <= N; i++) {
let iArr = String(i);
let A = Number(iArr[0]) - Number(iArr[1]);
let B = Number(iArr[1]) - Number(iArr[2]);
if (A === B) {
count++;
}
}
console.log(count);
한수
로 인정한다 해도 계산은 반드시 거치라는 의도라고 생각된다.
풀이 잘봤습니다😊 덕분에 잘 이해했습니다!