Seren dev's blog
article thumbnail

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

 

1212번: 8진수 2진수

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

www.acmicpc.net

풀이

처음에는 Integer 메서드를 사용하여 8진수 문자열 -> int -> 2진수 문자열 순서로 변환하여 문제를 풀 생각이었다.

하지만 입력으로 주어지는 수의 길이는 333,334 이기 때문에 숫자의 범위가 int형을 넘어서는 문제가 발생한다. long으로 타입을 바꿔줘도 런타임 에러(NumberFormat)가 발생한다.

이를 해결하기 위해 처음 String으로 입력받고 for문을 사용해 글자마다 글자 -> int -> 2진수 문자열로 바꾸는 로직을 작성한다.

 

8진수를 2진수로 변환하는 방법
-> 8진수 숫자 하나마다 3자리의 2진수로 변환
ex) 3 -> 011 // 5 -> 101

 

로직

1. 입력으로 주어지는 수를 문자열로 입력받는다.

2. for문을 사용하여 한 글자씩 추출하여 tmp 문자열에 저장한다.

3. Integer.parseInt() 를 사용하여 글자(tmp) -> int 형 숫자로 변환

3. Integer.toBinaryString() 를 사용하여 int형 숫자 -> 2진수 문자열(tmp)로 변환

4. 첫번째 글자가 아닌 경우, 3 - tmp.length() 만큼 bw.write('0');

5. bw.write(tmp)

 

코드

import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class Main {
	

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        String oct = br.readLine();
        
        for (int i = 0; i < oct.length(); i++) {
        	
        	String tmp = oct.substring(i, i+1); // 한 글자 추출
        	int n = Integer.parseInt(tmp); // 글자 -> 숫자로 변환
        	tmp = Integer.toBinaryString(n); // 숫자 -> 2진수 문자열로 변환
        	
        	// 첫번째 문자가 아니라면 3-(문자열의 길이)만큼 0을 추가
        	if (i != 0) {
        		for (int j = 0; j < 3 - tmp.length(); j++) {
        			bw.write('0');
        		}
        	}
        	bw.write(tmp);
        }
        
        bw.flush();
        bw.close();
        br.close();

    }
}

 

수정한 버전

한 글자를 추출하고 글자->숫자->2진수 문자열로 변환하는 과정을 한 줄로 줄였다.

String tmp = Integer.toBinaryString(oct.charAt(i) - '0');

import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class Main {
	

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        String oct = br.readLine();
        
        for (int i = 0; i < oct.length(); i++) {
        	
        	String tmp = Integer.toBinaryString(oct.charAt(i) - '0');
        	
        	// 첫번째 문자가 아니라면 3-(문자열의 길이)만큼 0을 추가
        	if (i != 0) {
        		for (int j = 0; j < 3 - tmp.length(); j++) {
        			bw.write('0');
        		}
        	}
        	bw.write(tmp);
        }
        
        bw.flush();
        bw.close();
        br.close();

    }
}

 

수정한 버전이 원래 버전보다 메모리와 실행 시간 측면에서 더 좋은 코드라는 것을 확인할 수 있다.


10진수를 2진수,8진수,16진수 문자열로 변환

int i = 127;

String binaryString = Integer.toBinaryString(i); // 2진수 -> int
String octalString = Integer.toOctalString(i);   // 8진수 -> int
String hexString = Integer.toHexString(i);       // 16진수 -> int

2진수,8진수,16진수 문자열을 10진수로 변환

int binaryToDecimal = Integer.parseInt(binaryString, 2);  // int -> 2진수
int binaryToOctal = Integer.parseInt(octalString, 8);  // int -> 8진수
int binaryToHex = Integer.parseInt(hexString, 16);  // int -> 16진수

 

 

참고: [Java]자바 진수변환(10진수->2진수,8진수,16진수)

 

 

 

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!