본문 바로가기

백준1312 - 소수 (부동소수점) node.js 본문

개발/algorithm

백준1312 - 소수 (부동소수점) node.js

자전하는명왕성 2024. 1. 27. 09:49

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

문제는 문제 내용 말마따나 a,b,n 의 수가 주어지고, a/b 를 나눈 소수에서 소숫점 아래 n의 자리를 구하는 문제다.

 

문제 해결 방식

단순한 문제라 생각되지만, 부동소수점에 대한 개념이 없다면 풀이가 어렵다. 부동소수점은 컴퓨터에서 실수를 표현하는 방식 중 하나로, 소수점을 고정된 위치에 두는 것이 아니라 소수의 위치를 조절하는 방식이다.

부동소수점은 컴퓨터 입장에서 효율적으로 실수 데이터를 저장하는데에는 좋은 방식이나, 알다시피 컴퓨터는 2진법으로 동작하기 때문에, 큰 소숫점에 경우는 계산과정에서 오차가 발생하기도 한다.

간단한 예시로 0.1과 0.2를 합할 경우를 예를 들면, 부동소수점 정확성 문제로 0.30000000000000004이라는 결과가 나타난다.

(깨알 팁) 여기서 부동의 한자어는 아니 부 | 움직일 동이 아닌, '뜰' 부를 쓰는 한자어로, 영어 번역을 그대로 가져다 씀으로써, 우리 말과 딱 맞아떨어지는 말은 아니다. => 때문에 소수 표기를 float 이라고 하기도 함.

 

따라서 부동소수점 문제 없이 문제를 해결하는 방법은, 우리가 초등학교 때 학습했던 나누기를 활용하여 풀이하면 된다.

 

전체 소스 코드

const fs = require("fs");
const input = fs
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "입력.txt")
  .toString()
  .trim()
  .split("\n");

function solution(data) {
  let [a, b, c] = data[0].split(" ").map(Number);
  let result = 0;
  for (let i = 0; i <= c; i++) {
    const rest = (a % b) * 10;
    result = Math.floor(a / b);
    a = rest;
  }

  console.log(result);
}

solution(input);
Comments