본문 바로가기

Algorithm

기수변환 알고리즘

이번 포스팅에서는 10진수를 2~36진수의 기수변환을 하는 코드를 작성하려 합니다.

기수변환의 기본 구조인 틀을 이해하되, 어떻게 표현할 지 생각하면서 정리해봅시다.



다음과 같은 꼴이 나옵니다.  만약 10진수를 2진수로 기수변환을 할 경우, 나누는 값을 2로 계속 나누면서 

0이 나올 때 까지 나눈 나머지를 모두 문자열처럼 합하여 표현하는 것입니다.

저는 이렇게 나눈 나머지를 배열에 넣어서 2진수로 표현할 것입니다.





또 신경써야 할 것은 2진수부터 36진수까지 표현입니다. 

2진수로 표현을 한다면 함수에 들어오는 값(나누는 값)에 대해서 %2 만을 배열에 넣으면 되는데, 

36진수까지 표현하려면 매번 나누는 값을 변환하는 번거로움이 있을 것입니다.

따라서, 36진수까지 표현하는 방법인 0~Z까지의 값을 문자열에 넣고 나머지로 해당 문자열의 인덱스의 

값을 가져오는 것입니다.



가령 16진수라하면 {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} 이렇게 가지기 때문에 36진수라하면 알파벳의 갯수 

26가지, 그리고 0부터 9까지 10가지해서 0~Z까지 표현해야 합니다.

그렇다면 이해를 돕고자 앞서 이미지를 16진수로 나누는 값을 표현하겠습니다.






다음과 같이 진행되게 됩니다.   이제 코드로 표현해봅시다.

필요한 것은 0부터 Z까지의 문자열, 나눌 값, 나누는 기수,이를 담을 배열입니다.

또한 위에 그림을 다시 확인하면 배열이 추가된 순서의 역으로 출력되는 것을 

알 수 있습니다. 

따라서 출력할 때에는 배열의 길이를 뽑아내어서 역순으로 배열을 출력해야함을 

알 수 있습니다.



먼저, 기수 변환 함수를 만들어 봅시다.






private static int cardConV(int x,int r,char[] d){

// x는 나눌 값, r은 나누는 기수,d는 나머지들로 찾은 문자열 요소들을 담을 배열

int index = 0;

String str ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

do{

d[index++] = str.charAt(x%r); // 나머지를 인덱스로 하는 str의 요소들 가져와서 배열에 넣기 

x /= r; // x는 기수로 나눈 몫으로 계속해서 업데이트가 필요

}while(x!=0); // 나누는 값이 0이 되면 끝나는 것


return index; 

// index값을 반환하는 이유는 배열의 길이를 반환해야만 main함수에서 d와 연결된 
// 다른 배열의 역순으로 출력할 수 있기 때문

}




Main함수를 확인해봅시다.


public static void main(String[] args){

Scanner scanner = new Scanner(System.in);

int no = scanner.nextInt(); // 나누는 값

int cd = scanner.nextInt(); // 나누는 기수

char[] cno = new char[32]; 

// 앞서 cardConV 함수의 파라미터인 d와 연결될 예정 --> 여기서 값을 받아올 것

int dno = 0; // cardConV 함수에서 반환되는 index의 길이를 담을 변수

int end = 0; // 끝내는 변수 

do{

dno = cardConV(no,cd,cno);

for(int i=dno-1;i>=0;i--){

System.out.print(cno[i]);

}

System.out.println("입니다.");

System.out.println("함수 종료 : 1 입력");

end = scanner.nextInt();

}while(end != 1);

}





이렇듯, cno함수는 cardConV 함수의 파라미터 d와 연결되어 입력되는 요소들을 접근할 수 있게 되고,

cardConV 함수가 종료되면서 반환되는 index값은 dno로 대입되어, 출력할 땐 cno의 역순으로 

출력할 수 있도록 만들어줍니다. 

다음과 같은 코드로 2진수부터 36진수까지 기수변환이 가능하게 됩니다. 

감사합니다.

반응형

'Algorithm' 카테고리의 다른 글

하노이탑 알고리즘  (0) 2018.11.20
배열 요소 최대공약수 구하기  (0) 2018.11.18
백트래킹 코드 정리  (0) 2018.10.16
카카오 예비 코딩테스트 2번  (1) 2018.08.03
BOJ_11066_파일합치기  (0) 2018.07.29