1. 백준 8393번 - 합
- https://www.acmicpc.net/problem/8393

[내가 작성한 코드]
[민주] 백준 단계별 문제풀이 - 반복문 by min-99 · Pull Request #37 · moonlight-duck/study-algorithms
📌 문제 정보 문제 링크 : https://www.acmicpc.net/step/3 카테고리 (예: 구현, 탐색, DP) : 반복문 ✏️ 풀이 방법 결과 (성공/실패) : - 풀이 시간 : - 풀이 방법 : - 참고한 글 링크 : ⭐ 비고 추천 여부 : 추
github.com
=> for문으로 1부터 n까지 돌려서 더한 결과를 출력함.
[다른 방법 생각해보기]
- 가우스 공식 이용하기 n*(n+1) / 2 로 한줄 계산가능 (시간복잡도 O(n) -> O(1)로 줄일 수 있음)
- for 말고 다른 방법: from하고 reduce 사용. (from으로 개수만큼 만들고, reduce로 값을 더해나감) => 기존코드보다 공간복잡도가 O(n)으로 증가함
2. 백준 2745번 - 진법
실무에서는 거의 대부분 10진법을 다루는 부분 밖에 잘 안해봤던 것 같습니다. 그래도 시험이나 코딩테스트를 할때 직접 2진법을 10진법으로 구하는 문제 정도 풀었던 것 같습니다. 매번 쓰는 javascsript 함수의 매개변수에 진법 기능이 있는 줄 몰랐습니다.
우선 2진법하고 10진법에만 주로 익숙해져 있는데요, 16진법이나 36진법 같은 곳에서는 10, 11, 12... 이런 숫자도 '한자리'에 표현을 해야 합니다. 하지만 9다음에는 이를 표현할 수 없는 숫자가 없기에 9 다음 숫자(10)부터는 A,B, C ... 순서대로 약속을 한것 입니다.
// N의 숫자를 B진법으로 바꿔줌
console.log(parseInt(N, B));
- parseInt mdn : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/parseInt
parseInt() - JavaScript | MDN
console.log(parseInt("123")); // 123 (default base-10) console.log(parseInt("123", 10)); // 123 (explicitly specify base-10) console.log(parseInt(" 123 ")); // 123 (whitespace is ignored) console.log(parseInt("077")); // 77 (leading zeros are ignored) cons
developer.mozilla.org
그러면, 반대로 다른 진법 문자열 → 10진법 숫자로 바꾸려면 어떻게 해야될까요?
const number = 255;
// 10진법 -> 16진법
console.log(number.toString(16)); // "ff"
// 10진법 -> 2진법
console.log(number.toString(2)); // "11111111"
// 10진법 -> 36진법
console.log(number.toString(36)); // "73"
정답은 toString() 함수를 사용하면 됩니다. toString()은 매개변수가 없는 줄 알았는데 앞에 Number와 BigInt에 한해서 선택적으로 기수(radix)를 받을 수 있다고 합니다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
Object.prototype.toString() - JavaScript | MDN
기본적으로 toString()은 매개변수가 없습니다. 그러나 이 메서드를 재정의한 Object를 상속받은 객체의 경우 매개변수를 취할 수 있습니다. 예를들어, Number.prototype.toString() 와 BigInt.prototype.toString()
developer.mozilla.org
3. 백준 2720번 - 부동소수점
아래의 코드의 결과를 어떻게 예상하시나요?
0.1 + 0.2 !== 0.3
실행 결과)

언어의 버그가 아니라, 컴퓨터의 실수(Real Number)를 2진수로 표현하는 근본적인 방식(IEEE 754 표준)의 한계 때문입니다.
우리가 10진법에서 1 / 3을 하면 0.33333... 처럼 무한히 반복되는 무한소수가 나옵니다. 또 0.1은 무한소수는 아니지만, 10진법에서 2진법으로 변환 될때 무한소수가 됩니다. 컴퓨터의 메모리는 유한하기 때문에 이를 다 저장할 수 가 없습니다. 따라서 대부분의 언어가 IEEE 754 표준을 따르기 때문에 오차가 발생합니다.
IEEE 754가 뭔데요?
컴퓨터는 숫자 하나를 저장하기 위해 64bit를 사용하는데, IEEE 754는 이 64bit를 세 구역으로 쪼개서 사용합니다.
- 부호비트 (Sign, 1 bit) : 양수인지 음수인지
- 지수부(Exponent, 11 bits): 소수점의 위치를 결정 (숫자의 크기, 스케일)
- 가수부(Mantissa, 52 bits): 실제 숫자의 유효 자릿수 (정밀도) 👈 실제 숫자를 표현할 수 있는 공간
교수님께서 '나중에 연구 현장에서 물리학자나 화학자들과 협업할 때, 소수점 20자리까지 일일이 나열해서 주면 안 된다'며 과학적 표기법에 대해서 설명해주셨던 부분이 새삼스럽게 생각이 납니다. 배웠던 부분들이 실무와 연결되니 공부가 의미있는것 같아 뿌듯합니다.
다른언어는 어떻게 다를까?
대부분의 언어가 IEEE 754 표준을 따르기는 합니다. 하지만 대처방법이나 타입 시스템에서 차이가 있습니다.
1) C, C++, Java : float나 double 타입을 사용하면 Typescript와 똑같이 오차가 발생합니다. (하지만 금융 계산 등을 위해 정밀한 10진수 연산 전용 클래스 BigDecimal을 내장하고 있습니다.)
2) Python : c언어와 유사하여 똑같이 오차가 발생합니다. 하지만 decimal 모듈을 import 해서 사용하면 정확한 계산이 가능합니다.
3) C# : float, double 외에 decimal 이라는 원시타입을 언어차원에서 지원합니다. (decimal은 128비트를 사용하여 부동소수점 방식이 아닌 10진수 연산 방식을 사용하여 금융계산에 최적화 되어 있습니다)
Typescript에서의 해결책
방법1 : 정수로 변환하여 계산한 다음에 다시 소수점 적용
방법2: 라이브러리 사용
방법3 : 오차 허용
'알고리즘' 카테고리의 다른 글
| 최대공약수(GCD), 최소공배수(LCM) - 유클리드 호제법 (0) | 2026.02.02 |
|---|---|
| 더 좋은 코드 만들기 2 (0) | 2026.01.29 |
| 시간/메모리 초과 개선 + 백준 환경이 잘못되었자나(개선후기, 구간 합 구하기, 백준 2042번 세그먼트 트리) (1) | 2025.11.19 |
| 공간복잡도 (0) | 2025.11.18 |
| LCS (백준 , 9251) (0) | 2025.11.18 |