백준 1065 번 Node.js 문제풀이

Cho Dragoo·2021년 5월 18일
0
post-thumbnail

JavaScript 백준 온라인 알고리즘 공부

백준 1065 번 Node.js 문제풀이

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



본인이 제출한 답안

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);
  • 참고로 카운드를 미리 99까지 넣고 푸는건 틀렸다고 처리한다. 한수로 인정한다 해도 계산은 반드시 거치라는 의도라고 생각된다.
profile
어떤 문제든 파악 할 수 있으며 해결책을 찾을 수 있는 개발능력을 꿈꾸고 있습니다.

5개의 댓글

comment-user-thumbnail
2021년 7월 23일

풀이 잘봤습니다😊 덕분에 잘 이해했습니다!

1개의 답글
comment-user-thumbnail
2021년 9월 21일

코드 정말 잘짜시는거같아요!
한수 배웠습니다 ㅎㅎㅎ

1개의 답글
comment-user-thumbnail
2022년 7월 16일

답 잘 나오는데 왜 자꾸 틀렸다고 하는가 했더니 count를 99로 미리 설정해두면 틀렸다고 하는 거였군요 ㅠㅠ 감사합니다

답글 달기