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진수)
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 9019번 : DSLR - 자바[Java] (0) | 2022.09.16 |
---|---|
[백준] 5014번 : 스타트링크 - 자바[Java] (1) | 2022.09.16 |
[백준] 2580번 : 스도쿠[Java] (0) | 2022.09.11 |
[백준] 20291번 : 파일 정리 - 자바[Java] (1) | 2022.09.11 |
[백준] 1987번 : 알파벳 - 자바[Java] (0) | 2022.09.10 |