백준 1212번 자바 문제풀이 - 8진수 2진수 풀이
진법변환은 오랜만이라 처음 문제를 풀기위하여 8진수를 10진수로 변환 후 2진수로 변환하였다.
제출 결과는 "틀렸습니다."....
테스트 케이스를 만들어 for문으로 돌려보아도 문제가 없기에 어디가 틀렸나 확인을 해보았더니, "수의 길이는 333,334 자리를 넘지 않는다." 라는 문장이 있었다....
처음 수가 333,334까지인줄 알았으나, 수의 길이가 333,334를 넘지 않는다는 것이였다.
10진수로 바꾸기 위해 Integer형 변수에 저장을 했었기 때문에 틀렸다고 나왔다.
BigInteger를 사용하면 시간초과가 날 것 같아 진법변환을 다시 찾아보았다.
8진수는 한자리씩 잘라 3자리의 2진수로 변경이 가능하다.
314의 경우 한자리씩 2진수로 변경하게 되면 다음과 같이 된다
3 = 011
1 = 001
4 = 100
314 = 011001100
수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다고 하니 앞의 0을 제거해주면
11001100이 된다.
이렇게 10진수로 변환한 다음 2진수로 변환하지 않고 한자리씩 2진수로 바꿔주면 자료형으로 인해 자릿수를 초과하는 일은 없다.
수정하여 제출하였더니 시간초과....
원인을 찾아보니 String의 경우 스트링변수 "+" 연산자를 사용하게 되면 문자열에 새로운 문자열이 추가되는 것이 아니라 새로운 문자열 객체를 만들고 그 객체를 참조한다고 한다.
그리하여 StringBuilder를 사용하여 풀었더니 성공!
완성된 소스는 다음과 같다.
문자열 길이만큼 반복하여 한글자씩 가져와 2진수로 변환하여 StringBuilder에 문자열 추가
2진수의 시작이 0이라면 0이 아닐때 까지 잘라주어 출력하면 성공한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
StringBuilder sb = new StringBuilder();
String[] b = {"000","001","010","011","100","101","110","111"};
for(int i=0;i<s.length();i++) {
int a = s.charAt(i)-'0';
sb.append(b[a]);
}
if(s.equals("0")) System.out.println(s);
else{
while(sb.charAt(0) == '0') sb = new StringBuilder(sb.substring(1));
System.out.println(sb);
}
}
}