today's alogrithm

[BOJ] 1212번 8진수 2진수 - JAVA

UR'im 2021. 6. 22. 16:13

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

 

1212번: 8진수 2진수

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

www.acmicpc.net

약 한달 전 런타임에러나서 포기하고 다른문제 풀다가 오늘 해결했다.

처음 문제를 풀때 수의 범위를 생각하지 않고 자바에 있는 내장함수를 이용했는데, 8진수를 10진수로 바꾸는 과정에서 수가 너무 커져 런타임에러가 발생했다.

그래서 귀찮아서 안풀고 있었는데 오늘 풀었다.

import java.util.*;
class Main{
	public static void main (String[] args){
		Scanner sc = new Scanner(System.in);
		String n = sc.next(); //8진수 입력
		long transString = Long.parseLong(n,8);
		System.out.println(Long.toBinaryString(transString));
	}
}

위와 같이 처음에는 단순하게 코드를 작성했는데 수가 작았어도 이 코드는 틀린 코드이다.

왜냐면 toBinaryString을 사용하면 3이 011이 아니라 11로 나와서 틀려버린다.

다시 풀어본 코드는 아래와같다.

아예 처음부터 0-7까지를 배열로 저장해두는데, 참고로 길이를 3으로 맞춰줘야하기때문에 StringBuffer을 사용해서 앞에 0을 부족한 만큼 넣어주게 했다.

import java.util.*;
class Main{
	static String[] binary = new String[8];
	public static void main (String[] args){
		Scanner sc = new Scanner(System.in);
		String n = sc.next(); //8진수 입력
		StringBuffer sb = new StringBuffer();
		if(n.equals("0")){
			System.out.println(0);
			return;
		}
		for(int i = 0; i<8; i++){
			StringBuffer str = new StringBuffer(Integer.toBinaryString(i));
			if(str.length() == 1) str.insert(0, "00");
			if(str.length() == 2) str.insert(0,"0");
			binary[i] = str.toString();
		}
		int leng = n.length();
		for(int i = 0; i<leng; i++){
			int c = n.charAt(i) - '0';
			sb.append(binary[c]);
		}
		while(sb.charAt(0) == '0'){
			sb.deleteCharAt(0);
		}
		System.out.println(sb.toString());
	}
}

마지막으로 앞쪽이 0이면 안되기때문에 while문을 사용해서 앞이 0이면 StringBuffer에서 지워지도록 했다.

코드 길이가 약 3배나 된다... 더 좋은 방법을 구상해보는게 좋겠다..