Recent Posts
Recent Comments
Link
- Today
- Yesterday
- Total
메이쁘
(JAVA) 백준 1212번 : 8진수 2진수 본문
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진수의 전체 길이라고 생각하면 안된다.
큰 이슈는 없기 때문에 매커니즘은 따로 작성하지 않고
위 조건들을 잘 파악해서 코딩하면 된다.
궁금한 알고리즘은 필자의 소스코드에 주석과 함께 작성했습니다.
감사합니다.
소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
'Algorithm > Baekjoon' 카테고리의 다른 글
(JAVA) 백준 2847번 : 게임을 만든 동준이 (0) | 2020.08.30 |
---|---|
(JAVA) 백준 1699번 : 제곱수의 합 (1) | 2020.08.30 |
(JAVA) 백준 1373번 : 2진수 8진수 (0) | 2020.08.29 |
(JAVA) 백준 9012번 : 괄호 (0) | 2020.08.26 |
(JAVA) 백준 10988번 : 팰린드롬인지 확인하기 (0) | 2020.08.26 |