백준

[백준/BOJ] 1212번 : 8진수 2진수 (JAVA / 자바)

코메인 2022. 1. 28. 16:30

안녕하세요~ 코딩하는 코알못 코메인입니다.

 

 

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

 

1212번: 8진수 2진수

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

www.acmicpc.net


- 문제 -

 

난이도 브론즈 3 문제이다.

 

자바에서 입력방식은 scanner와 bufferedreader가 있다.

자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.

bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.

더 자세한 내용은 아래 글 참고 하면 좋다.

https://comain.tistory.com/3

 

(JAVA / 자바) Scanner 와 Bufferedreader

안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자

comain.tistory.com

 

풀이 방법

8진수는 0부터 7까지다. 그리고 2진수를 8진수로 바꿀때 3자리수끼리 잘라서 8진수의 한자리를 만들어 낸다. 이말은 곧 8진수 한자리당 2진수 3자리를 만들어낸다는 것이다.

2진수 3개로 만들 수 있는 제일 큰 수는 111 > 7이다. 계산은 1*2의2제곱 + 1*2의1제곱 + 1*1이다. 이걸로 알 수 있는 것은 8진수 한자리 수마다 온 수를 4와 2와 1로 빼서 2진수 값을 뽑으면 되는 거다.

뽑은 값들은 stringbuilder를 만들어 저장 해 줄것이다. 하지만 문제에서 2진수로 변환 했을때 맨 앞에 0이 오면 안된다 한다. 그렇기에 8진수 맨 앞자리를 2진수 3개로 만들었을때 맨앞에 1이 오지 않는 경우를 조건문으로 걸고 지운다. 코드로 보자.


-풀이-

 

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //자릿수마다 2진수로 바꿔야하기에 string으로 선언
		String S = br.readLine();
        //2진수 값을 저장해줄 StringBuilder
		StringBuilder sb = new StringBuilder();
		
        //8진수 문자열을 맨 앞자릿수부터 4~7일 경우 4를빼고 sb에 1 저장, 아닐경우 sb에 0저장
       	//2~3일 경우 2를 빼고 sb에 1저장, 아닐 경우 sb에 0 저장
        //1일 경우 1을 뺴고 sb에 1저장, 아닐 경우 sb에 0 저장
		for(int i = 0; i < S.length(); i++) {
			int N = S.charAt(i) - '0';
			if(N >= 4) {
				sb.append(1);
				N -= 4;
			}else {
				sb.append(0);
			}
			if(N >= 2) {
				sb.append(1);
				N -= 2;
			}else {
				sb.append(0);
			}
			if(N == 1) {
				sb.append(1);
				N -= 1;
			}else{
				sb.append(0);
			}
		}
        
        //8진수 맨 앞의 숫자가 1일때 2진수는 001이니 00두개 지워준다.
        //8진수 맨 앞의 숫자가 2~3일때 2진수는 010또는 011이니 0한개 지워준다.
		if(S.charAt(0) == '1') {
			sb.delete(0, 2);
		}else if(S.charAt(0) == '2' || S.charAt(0) == '3') {
			sb.deleteCharAt(0);
		}else if(S.charAt(0) == '0') {
			sb.delete(0, 2);
		}
		System.out.println(sb);
	}
}

-결과-

 


아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠다.