알고리즘/백준
공부 112일차: 백준 1373번 2진수 8진수 자바 java
김발자~
2022. 11. 19. 21:26
반응형
1373 2진수 8진수
https://www.acmicpc.net/problem/1373
1373번: 2진수 8진수
첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.
www.acmicpc.net
백준 1373번 문제 2진수 8진수
문제
과정 생각해보기 & 오답
우선 2진수를 8진수로 변환하는 방법에 대해 알아야 한다
위의 그림에서 표시한 것처럼, 2진수를 뒤에서부터 3개씩 나눈 뒤, 자리수에 따라 2^2, 2^1, 2^0과 곱하면 된다
000이 세번 연속되어 나오면 자리에 0을 채워준다(생략하지 않음)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String binary = br.readLine();
int len = binary.length();
String[][] arr = new String[(len/3)+1][3]; //3으로 나누어 떨어지지 않을 수 있으므로 1이 더
int j = 0;
int k = 0;
for(int i = len-1; i >= 0; i--) { //뒤에서부터 3개씩 끊어야 하므로 뒤부터 반복문을 돌린다
arr[j][k] = binary.charAt(i)+"";
k++;
if(k == 3) {
j++; //다음[!][] 배열로 넘어간다
k = 0;
}
}
//디버깅
//System.out.println(Arrays.deepToString(arr));
int sum = 0;
String octal = ""; // 0이 나와도 빈공간으로 채워야 하므로 문자열로 선언
for(int i = len/3; i >= 0; i--) {
sum = 0;
for(int idx = 0; idx < 3; idx++) {
String ch = arr[i][idx];
if(ch == null) {
continue;
}
if(ch.equals("1")) {
sum += (int)Math.pow(2, idx); //1이면 2^idx를 더한다
}else {
sum += 0; //0이나 null이면 0을 더한다
}
//디버깅 System.out.println(sum);
}
octal += sum;
}
System.out.println(octal);
}
}
// 메모리 초과
|
cs |
주석에 자세하게 설명을 적었다
내가 짜면서도 불안불안하긴 했지만.. 메모리초과가 떴다
정답 인정 코드
https://dundung.tistory.com/26
이 블로그를 참고한 코드
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
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String binary = br.readLine();
int len = binary.length();
// 정수char - '0' = 정수
if(len%3 == 2) { // 3개씩 끊고 2개 남음
sb.append((binary.charAt(0)-'0')*2 + (binary.charAt(1)-'0'));
} else if(len%3 == 1) { // 3개씩 끊고 1개 남음
sb.append(binary.charAt(0)-'0');
}
//3개씩 끊기는 수
for(int i = len%3; i < len; i+=3) {
sb.append((binary.charAt(i)-'0')*4+(binary.charAt(i+1)-'0')*2+(binary.charAt(i+2)-'0')*1);
}
System.out.println(sb);
}
}
|
cs |
나 역시 StringBuilder로 붙이는 것까진 생각했지만,
3개씩 끊는 걸 어떻게 해야할지 모르겠어서 위처럼 삽질했던 건데 생각보다 엄청 간단했다
맨날 몫만 보고 나머지는 생각 못해서 빙빙 돌아가는 것 같다
비록 메모리 초과가 뜨긴 했지만 푸는 데 재미가 있었다
반응형