본문 바로가기

코딩테스트/Baekjoon

[JAVA] 백준 1212번: 8진수 2진수

< 문제 >

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

 

1212번: 8진수 2진수

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

www.acmicpc.net

< 틀린 풀이>

package bronze;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//8진수 2진수
public class p1212 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String n=br.readLine();
		String binary[]= {"000","001","010","011","100","101","110","111"};
		
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<n.length();i++) {
			int num=n.charAt(i)-'0';
			sb.append(binary[num]);
		}
		
		String answer=sb.toString();
		if(answer.charAt(0)=='0') {
			if(!n.equals("0")) {
				while(answer.charAt(0)=='0')
					answer=answer.substring(1);
			}	
		}
		
		System.out.println(answer);
		
	}

}

 

 

🙅🏻‍♂️ 틀린 이유

 

1. 처음에 나는 0을 입력했을 때는 000이 나와야된다고 생각했다.

그래서 0일 때 출력 형태를 고치지 않아 계속 틀렸다. 🥹

 

2. 처음 풀이(위의 풀이는 2번째 풀이)에서는 앞에 0이 하나만 올 수 있다고 생각해서

그저 substring(1)을 한 값을 출력해서 틀렸다. (왜 그렇게 생각했는지 모르겠다.)

ex) 101 = 001000001 이므로 0이 다 없어질 때까지 반복문을 돌아야한다.

 

<올바른 풀이>

package bronze;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//8진수 2진수
public class p1212 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String n=br.readLine();
		String binary[]= {"000","001","010","011","100","101","110","111"};
		
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<n.length();i++) {
			int num=n.charAt(i)-'0';
			sb.append(binary[num]);
		}
		if(n.equals("0")) //입력받은 수가 0일 때
			System.out.println(n); //0을 출력
		else { //입력 받은 수가 0이 아닐때 
			while(sb.charAt(0)=='0') { //맨 앞의 수가 0인 경우 반복문 돌기
				sb=new StringBuilder(sb.substring(1)); //문자열 자르기 
			}
			System.out.println(sb);
		}
		
		
	}

}

 

 

✏️ 풀이 방법

 

1. 입력 받은 수는 8진수이므로 0~7의 값만 갖고 있다. 

그렇기 때문에 String형의 배열에 0~7 의 2진수 값을 저장한다. 

 

2. 입력 받은 수의 길이만큼 반복문을 돌면서,

각 자리에 해당하는 수를 2진수로 변환해 StringBuilder를 사용하여 값을 붙인다. 

ex) 314 의 경우, sb= 011001100

 

3. 입력 받은 수가 0 일 경우에는 0을 그대로 출력하고,

0이 아닌 경우에는 앞자리의 0이 없어질 때까지 substring(1)을 반복하며

sb의 값을 변경하고 출력한다. 

 

✍🏻 느낀점

 

나는 조건을 따져서 예외 처리 하는 것을 잘 못하는 것 같다.

문제를 읽고, 어떻게 조건을 나눠서 처리해야할지를 

먼저 생각해야겠다. 계속 풀면 나아지겠지..?