일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- dfs
- Stack
- Java
- Python
- SQL
- 배열
- oracle
- 새벽코딩
- 완전탐색
- DP
- 알고리즘
- 백준
- 아스키코드
- 프로그래머스
- BFS
- HashMap
- BufferedReader
- LIS
- 문자열
- 그리디
- 탐색
- Queue
- 스택
- 빅데이터
- 구현
- 다이나믹프로그래밍
- 브루트포스
- 시뮬레이션
- 다리 만들기
- 백트래킹
Archives
- Today
- Total
새벽코딩
[백준] [1212] 8진수 2진수 본문
반응형
문제
8진수가 주어졌을 때, 2진수로 변환하는 프로그램을 작성하시오.
입력
첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.
출력
첫째 줄에 주어진 수를 2진수로 변환하여 출력한다. 수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String in = br.readLine();
int len = in.length();
int start = 0;
long tenVal = 0;
for(int i = len-1; i >= 0; i--) {
int val = Character.getNumericValue(in.charAt(start++));
tenVal += (val * Math.pow(8, i));
}
String twoVal = Long.toBinaryString(tenVal);
System.out.println(twoVal);
}
}
처음 문제를 봤을때 입력조건인 주어지는 수의 길이는 333,334을 넘지 않는다. 라는 조건을 간과한 것이 틀린 이유였다. 수의 크기가 아니고 길이가 33만자리가 넘기때문에 Long형으로도 출력할 수가 없을만큼 긴 문자열이 나오게 된다.
그래서 숫자형변환이 아닌 문자열로만으로 2진수를 만드는 방법을 선택했다.
사실 8진수는 각자리가 2진수 세자리로 변환할 수 있다.
8진수 {0, 1, 2, 3, 4, 5, 6, 7}은 2진수 {"000", "001", "010", "011", "100", "101", "110", "111"}로 바뀔 수 있다.
String에 입력 숫자를 문자열로 담아두고 인덱스를 증가하며 출력문자열에 append하였다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String in = br.readLine();
StringBuilder sb = new StringBuilder();
String[] s = {"000", "001", "010", "011", "100", "101", "110", "111"};
int idx = 0;
if("0".equals(in)) {
sb.append("0");
}
else {
int len = in.length();
while(true) {
if(len == 0) break;
int val = Character.getNumericValue(in.charAt(idx));
switch (val) {
case 0:
sb.append(s[0]);
break;
case 1:
if(idx == 0) sb.append("1");
else sb.append(s[1]);
break;
case 2:
if(idx == 0) sb.append("10");
else sb.append(s[2]);
break;
case 3:
if(idx == 0) sb.append("11");
else sb.append(s[3]);
break;
case 4:
sb.append(s[4]);
break;
case 5:
sb.append(s[5]);
break;
case 6:
sb.append(s[6]);
break;
case 7:
sb.append(s[7]);
break;
}
idx++;
len--;
}
}
System.out.println(sb);
}
}
출력조건에 이런 내용이 있다. 수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다
이를 위해 8진수 0이 입력되는 경우와 8진수 맨 앞자리가 1, 2, 3 이면 따로 2진수에서 0을 지워주는 로직이 필요하다.
예로, 만약 1이 입력되었을 때 "001" -> "1" 이 되야한다는 의미이다.
-새벽코딩-
반응형
'알고리즘' 카테고리의 다른 글
[백준] [9251] LCS (0) | 2022.11.21 |
---|---|
[백준] [1032] 명령 프롬프트 (0) | 2022.11.20 |
[백준] [10824] 네 수 (0) | 2022.11.17 |
[백준] [1764] 듣보잡 (0) | 2022.11.16 |
[백준] [4949] 균형잡힌 세상 (0) | 2022.11.15 |
Comments