https://www.acmicpc.net/problem/1212
방법1: 8까지의 2진수를 미리 배열에 저장해두고 호출
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
|
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String[] arrFirstOct = {"0","1","10","11","100","101","110","111"};
String[] arrOct = {"000","001","010","011","100","101","110","111"};
String strOctNum = br.readLine();
sb.append(arrFirstOct[strOctNum.charAt(0) - '0']);
int iOctlen = strOctNum.length();
for (int i = 1; i < iOctlen; i++) {
sb.append(arrOct[strOctNum.charAt(i) - '0']);
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Colored by Color Scripter
|
방법2: 수 한자리 한자리 모두 계산하여 2진수로 만들기
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
|
import java.io.*;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String strOctNum = br.readLine();
for (int i = 2; i >= 0; i--) {
if (strOctNum.charAt(0) - '0' >= Math.pow(2, i)) {
sb.append(oneBinaryUnit(strOctNum.charAt(0) - '0', i + 1));
break;
} else if (strOctNum.charAt(0) - '0' == 0) {
sb.append(0);
break;
}
}
int iOctlen = strOctNum.length();
for (int i = 1; i < iOctlen; i++) {
sb.append(oneBinaryUnit(strOctNum.charAt(i) - '0', 3));
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
public static String oneBinaryUnit(int i, int length) {
String oneBinaryUnit = "";
Stack<Integer> stack = new Stack<Integer>();
for (int k = 0; k < length; k++) {
stack.push(i%2);
i = i/2;
}
while(!stack.isEmpty()) {
oneBinaryUnit += stack.pop();
}
return oneBinaryUnit;
}
}
Colored by Color Scripter
|
c++소스
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
|
#include <iostream>
using namespace std;
// 8진수 -> 2진수. 0을 채워서 반환한다.
string octal_to_binary(char octal)
{
int ot = octal - '0';
char bin[4] = {0,};
for (int i = 0; i < 3; i++)
{
bin[2 - i] = ot % 2 + '0';
ot /= 2;
}
return bin;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string input;
cin >> input;
// 첫번째 숫자만 따로 처리. 4 미만일 경우, 미리 만들어둔 배열 출력
string first[4] = { "0", "1", "10", "11" };
if (input[0] < '4')
{
cout << first[input[0] - '0'];
}
// 4 이상일 때 일반 숫자와 같이 출력
else
{
cout << octal_to_binary(input[0]);
}
for (int i = 1; i < input.size(); i++)
{
cout << octal_to_binary(input[i]);
}
return 0;
}
Colored by Color Scripter
|
방법1: 8까지의 2진수를 미리 배열에 저장해두고 호출
방법2: 수 한자리 한자리 모두 계산하여 2진수로 만들기
방법1이 방법2보다 메모리는 훨씬! 적게 먹고 시간은 2배 빨랐다.
TIP1
그때그때 수를 계산하는 것보다,
배열의 인덱스 = 수 한자리로 생각하여 배열로 2진수를 호출하는 것이 더 효율적이다.
TIP2
맨 앞자리 숫자가 0으로 시작하면 안되므로
첫번째 자리만 다르게 취급해주자.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]17103번: 골드바흐 파티션(java, c++) (0) | 2019.09.24 |
---|---|
[BOJ]2089번: -2진수(java, c++) (0) | 2019.09.23 |
[BOJ]1373번: 2진수 8진수(java, c++) (0) | 2019.09.23 |
[BOJ]17087번: 숨바꼭질 6(java, c++) (0) | 2019.09.23 |
[BOJ]9613번: GCD 합(java, c++) (0) | 2019.09.23 |
댓글