백준 2745번, 11005번에서 진법을 변환하는 유형을 풀어보았다.
관련 내용을 한 번에 정리해보고자 한다.
진법을 변환하는 방법은 크게 두 가지로 구분할 수 있다.
- 수학적 풀이
- 메소드 사용
1. 수학적 풀이
N진법을 10진법으로 변환하는 방법과 10진법을 N진법으로 변환하는 방법을 수학적으로 나타내면 다음과 같다.
N진법을 10진법으로 변환하는 유형
let [N, B] = require('fs').readFileSync('/dev/stdin').toString().split(' ')
B = Number(B)
N = N.split('').reverse()
let decimal = 0
let number = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for (let i = 0; i < N.length; i++) {
let value = number.indexOf(N[i])
decimal += value * Math.pow(B, i)
}
console.log(decimal)
10진법을 N진법으로 변환하는 유형
let [N, B] = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(Number)
let number = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
let output = ''
while (N > 0) {
let remainder = N % B
let quotient = Math.floor(N/B)
output += number[remainder]
N = quotient
}
console.log(output.split('').reverse().join(''))
2. 메소드 사용
N진법을 10진법으로 변환하는 유형
parseInt 메소드를 사용하면 N진법을 10진법으로 변환할 수 있다.
praseInt(string, radix)
- string: 정수형 숫자로 변환하고자 하는 문자열 값
- radix: string의 진수 값 (optional)
parseInt 메소드는 radix진수 string을 10진수 정수형 숫자로 변환한 값을 반환한다.
radix가 없을 경우 일반적으로 string을 10진수로 해석하지만, 0, 0x 등 특정 접두사에 의해 혼란이 발생할 수 있다.
let [N, B] = require('fs').readFileSync('/dev/stdin').toString().split(' ')
B = Number(B)
let decimal = parseInt(N, B)
console.log(decimal)
10진법을 N진법으로 변환하는 유형
toString 메소드를 사용하면 10진법을 N진법으로 변환할 수 있다.
이때, 기본적으로 Object.prototype.toString()은 매개변수 없이 단순히 문자열 변환 기능을 수행하지만,
이를 재정의한 Object를 상속받은 객체의 경우 선택적으로 매개변수를 취할 수 있다.
예를 들어 Number.prototype.toString(), BigInt.prototype.toString()이 있다.
toString(radix)
- radix: 변환하고자 하는 진수 값 (optional)
toString 메소드는 10진수 숫자를 radix진수 string으로 변환한 값을 반환한다.
let [N, B] = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(Number)
let output = N.toString(B).toUpperCase()
console.log(output)