주어진 2진수를 8진수로 바꾸면 되는 문제이다.
간단해보이는 문제이지만 정답률이 37퍼센트이다.
내 생각에 37퍼센트인 이유는
문제를 보고 반 이상의 사람들은 2진수를 10진수로 바꾼다음에 8진수로 변환했을 것이다.
Integer메소드를 활용해서 말이다.
나 또한 처음에 그렇게 풀었는데 결과는 시간초과였다..
항상 배워도배워도 까먹는 2진수를 8진수로 변환하는 법을 다시 한번 정리한다.
110101 이라는 이진수가 있을 때
세 자리씩 끊어서 10진수로 변환하면 8진수가 된다.
110/101
110 -> 6
101 -> 5
=>65
이런 방법으로 2진수를 바로 8진수로 바꿔주면 맞췄습니다가 뜬다.
하지만 이것을 코드로 옮기는 것도 쉽지만은 않다.
10101인 경우
10/101로 끊어지게 되고 세 자리가 아닌 경우를 처리해줘야 하기 때문이다.
코드를 보며 이해해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public static void main(String [] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
int n = s.length();
if (n%3 == 1) { //세 자리씩 끊었을 때 맨 앞에 한 자리만 남는경우
System.out.print(s.charAt(0));
} else if (n%3 == 2) { //두 자리만 남는경우
System.out.print((s.charAt(0)-'0')*2 + (s.charAt(1)-'0'));
}
//나머지 경우
for (int i=n%3; i<n; i+=3) {
System.out.print((s.charAt(i)-'0')*4 + (s.charAt(i+1)-'0')*2 + (s.charAt(i+2)-'0'));
}
}
|
2진수 8진수와 반대인 문제 8진수 2진수 이다.
처음에 봤던 문제가 2진수를 8진수로 바꾼다면 이 문제는 8진수를 2진수로 바꾸는 문제이다.
방식은 똑같다. 반대로 251이라는 8진수가 있으면
한자리씩 2진수로 변환해주면 된다.
10/101/001
2 5 1
하지만 이문제가 위에 문제보다 더 어렵다.
이진수로 변환한 결과가 1인경우엔
3자리를 맞추기 위해 앞에 00을 붙여서 001로 만들어줘야하고
맨앞자리가 3자리가 아닐 경우 역시 처리해줘야한다.
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
|
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String[] eight = {"000","001","010","011","100","101","110","111"};
String s = scan.nextLine();
boolean start = true;
if (s.length() == 1 && s.substring(0, 1).equals("0")) { //입력받은 수가 0인 경우
System.out.print(0);
}
for (int i=0; i<s.length(); i++) {
int n = Integer.parseInt(s.substring(i,i+1));
if (start == true && n < 4) { //첫번째 자리수 && 3자리가 아닌 2진수 일때
if (n == 0) {
continue;
} else if (n == 1) {
System.out.print("1");
} else if (n == 2) {
System.out.print("10");
} else if (n == 3) {
System.out.print("11");
}
start = false;
} else {
System.out.print(eight[n]);
start = false;
}
}
}
|
1 ~ 7 을 세자리의 이진수로 바꾼 값을 배열에 인덱스에 맞게 넣어줌으로써 앞자리를 제외한 세자리 처리가
간단하게 해결됐다. 앞자리가 0일 경우의수가 3가지 밖에 없으므로 if문으로 따로 쳐리해준다.
코드로 볼 때는 쉬워보이지만 막상 생각하기는 정말 어렵다.ㅠ
'Algorithm' 카테고리의 다른 글
백준 1978 소수 찾기 Java (0) | 2019.04.16 |
---|---|
백준 2089 -2진수 Java (0) | 2019.04.16 |
백준 2745 진법 변환 Java (0) | 2019.04.15 |
백준 11005 진법 변환 2 Java (0) | 2019.04.15 |
백준 2609 최대공약수와 최소공배수 Java (0) | 2019.04.15 |