본문 바로가기

CS/Algorithm

N진법

⚠️ 코드 없이, 설명만 작성된 글입니다.


[N진법]?

10진법에 익숙한 우리에게 N진법은 다소 어색하게 느껴진다.

하지만, 우리는 이미 일상에서 다양하게 N진법을 접하고 있다.

예를 들어 생각해 보자.

연필은 한 다스는 12자루이다.

그럼 연필이 30개면? 2다스 6자루가 된다.

즉, 10진수로 30은, 12진수로 26이된다.

연필 12자루 / 셔터스톡

아직 애매한가?

그럼 계란의 경우도 생각해보자.

계란은 한판에 30개로 구성된다.

그럼 계란이 3판에 3개가 추가로 있다면 총 몇 개의 계란이 있는 것일까?

답은 93개이다.

즉, 30진수로 33은 10진수로 93이 되는 것이다.

우리는 이처럼, 이미 자연스럽게 다양한 진법을 실생활에 사용해 왔다.

단순하게 아래와 같이 생각하고, 변환법을 바로 알아보자.

N진법 = 모든 자리 수가 0~(N-1)의 수로 표기된 수의 표기법


[변환 방법]

변환 방법은 두가지로 설명하겠다.

  • 10진법에서 N진법으로 변환하는 방법
  • N진법에서 10진법으로 변환하는 방법

[10진법에서 N진법으로 변환하기]

10진법에서 N진법으로의 전환은, 변환하고자 하는 수를 N으로 반복해서 나누며, 계산 중 발생되는 나머지 값들과마지막에 남는 몫을 읽는 것이다.

말로 보면 이해 안간다. 바로 예시를 보자.

예시 1: 45(10)45_{(10)}을 2진법으로 변환하기

  1. 45 / 2 = 22…1
  1. 22 / 2 = 11…0
  1. 11 / 2 = 5…1
  1. 5 / 2 = 2…1
  1. 2 / 2 = 10

위 과정에서 빨간 색으로 강조된 마지막 몫과 계산 중 나오는 나머지 값들을 아래서 위로 순차적으로 읽으면 된다.

⇒ 2진법으로 변환된 값: 101101(2)101101_{(2)}

추가로, 보통 CS에서 2진법을 표기할때는 숫자 0과 binary의 첫글자인 b를 붙여서 표기함으로써 2진법임을 나타낸다.

∴ 0b101101

예시 2: 45(10)45_{(10)}을 16진법으로 변환하기

  1. 45 / 16 = 213

⇒ 16진법으로 변환된 값: 2D(16)_{(16)}

추가로, 보통 CS에서 16진법을 표기할때는 숫자 0과 알파벳 x를 붙여서 표기함으로써 16진법임을 나타낸다.

∴ 0x2D

13인데, D는 뭐지??

보통 10진법을 넘어서는 진법에서 9이후의 수를 표시하기위해 대문자 알파벳을 사용한다.

A: 10, B: 11, C: 12 … Y: 34, Z: 35

[N진법에서 10진법으로 변환하기]

우선 공식은 다음과 같다.

📏
공식

i=0mnidi∑^{m}_{i=0} n^id_i

  • n = n 진법
  • i = index 값
  • d = i 자리수의 n진법 값

위 예제1,2 에서 변환해본 숫자를 다시 10진법으로 되돌리면서 적용해 보겠다.

예시 3: 0b101101을 10진법으로 변환하기

인덱스(i)543210
2진법(0b)101101
공식2512^5*12402^4*02312^3*12212^2*12102^1*02012^0*1
3208401

값의 합: 32 + 0 + 8 + 4 + 0 + 1 = 45

예시 4: 0x2D를 16진법으로 변환하기

인덱스(i)10
2진법(0b)2D
공식161216^1*2160D(=13)16^0*D(=13)
3213

값의 합: 32 + 13 = 45


[N진법 관련 백준 알고리즘 문제]


Uploaded by N2T

'CS > Algorithm' 카테고리의 다른 글

에라토스테네스의 체  (2) 2023.10.20
유클리드 호제법(Euclidean algorithm)  (2) 2023.10.14
힙(Heap)  (0) 2023.03.01
스택(Stack)  (0) 2023.02.27
큐(Queue)  (0) 2023.02.27