메이쁘

(JAVA) 백준 1212번 : 8진수 2진수 본문

Algorithm/Baekjoon

(JAVA) 백준 1212번 : 8진수 2진수

메이쁘 2020. 8. 29. 16:21

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

 

1212번: 8진수 2진수

첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.

www.acmicpc.net

 

 

안녕하세요.

 

이전 포스팅의 2진수 8진수와 반대되는 문제다.

 

 

8진수를 2진수로 변환하는 문제인데,

 

이 역시 마찬가지로 입력 조건을 잘 봐야 한다.

 

 

"주어지는 수의 길이는 333,334을 넘지 않는다."

 

 

즉, 10진수로 8^333334 의 값이 나올 수 있어 숫자 변수를 사용할 수 없다. (직접 변환이 빠르고, 메모리 초과도 발생하지 않는다.)

 

 

그렇기 때문에, 8진수 1자리 -> 2진수 3자리 로 바꿔서 각각의 결과를 하나의 문자열로 합쳐야 한다.

 

ex)

8진수 314 -> 011 001 100 (2진수)

8진수 45 -> 100 101 (2진수)

 

 

단, 가장 앞자리에 0이 있으면 생략해야 하므로 이에 대한 예외처리를 별도로 해줘야 한다.

 

무턱대고 3 * 8진수 길이 가 2진수의 전체 길이라고 생각하면 안된다.

 

 

큰 이슈는 없기 때문에 매커니즘은 따로 작성하지 않고

 

위 조건들을 잘 파악해서 코딩하면 된다.

 

 

 

궁금한 알고리즘은 필자의 소스코드에 주석과 함께 작성했습니다.

 

감사합니다.

 

 

 

소스코드


 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 8진수 2진수
// 문자열 처리
public class p1212 {
static char[] twoCharArr;
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String eight = br.readLine();
char[] eightCharArr = eight.toCharArray();
int twoLen = getPossibleDigitNumber(eightCharArr);
twoCharArr = new char[twoLen];
int index = twoLen - 1;
// 가장 첫 번째 자리(맨뒤의 수) 부터 탐색 시작
for(int i = eight.length() - 1; i >= 0; i--) {
char num = eightCharArr[i];
index = getTwoDigitNumber(num, index);
}
System.out.print(new String(twoCharArr));
}
// 8진수 숫자 1개 -> 2진수 숫자 3개 변환
// 2진수의 현재 index 리턴
static int getTwoDigitNumber(char ch, int nowIndex) {
int num = ch - '0';
// 총 3회 반복
for(int i = 0; i < 3; i++) {
twoCharArr[nowIndex--] = (char) ((num % 2) + '0');
num /= 2;
if(nowIndex < 0) { // 이미 전체 2진수개수를 알고 있으므로 index로 길이 판단.
break;
}
}
return nowIndex;
}
// 8진수를 2진수로 변환했을 때의 2진수의 길이 리턴
static int getPossibleDigitNumber(char[] charArr) {
int len = charArr.length * 3;
if(len == 0) {
return 0;
}
int firstNum = charArr[0] - '0';
if(firstNum / 4 > 0) { // 첫 번째 숫자가 3자리 수 가능
return len;
}
if(firstNum / 2 > 0) { // 첫 번째 숫자가 2자리 수 가능
return len - 1;
}
return len - 2;
}
}
view raw p1212.java hosted with ❤ by GitHub
Comments