[백준(baekjoon) 1373] 2진수 8진수

2018. 8. 21. 22:04Algorithm

반응형
[백준(baekjoon) 1373] 2진수 8진수

문제

백준 1373

입력되는 2진수를 8진수로 바꾸어라.

  • 2진수의 길이는 1,000,000을 넘지 않는다.

해결

3개씩 묶어 8진수로 바꾸어주면 된다. (2진수 -> 10진수로 바꾸는 방법과 동일)
뒤에서 부터 묶기 때문에 앞에 부족한 부분을 어떻게 하느냐가 문제
나는 input을 char []으로 받아 index가 범위를 벗어날 때 아무처리도 하지 않았다.

주의

쉬운 문제지만 많이 틀렸다.
그 이유는

  1. 범위 문제
    처음 문제를 잘못 이해해서 1,000,000이하의 수가 들어온다는 줄 알았다.
    하지만 1,000,000자리이므로…. 숫자로 받으면 안된다. 범위를 훨씬 넘기기 때문
    output역시 long을 넘어간다. 따라서 문자열로 처리해야한다.
  2. 시간 문제
    위의 문제를 파악하고 간단히 String으로 처리했지만, 당연히 시간초과
    그 이유는 String은 새로운 객체를 생성하여 복사하는 방식으로 붙이기 때문이다.
    그래서 StringBuilder를 쓰고자 했는데 나의 경우 뒤에서부터 작업을 하기 때문에
    새로운 값 + 기존 값으로 붙여야해서 append가 무의미 했고, String가 다를 것이 없었다.
    그래서 고민 끝에 char []배열에 받아 끝에 String으로 출력하였다.

구현 java

1.import java.util.*;
2.
3.public class Main {
4. public static void main(String[] args) {
5. Scanner sc = new Scanner(System.in);
6. char[] inputs = sc.nextLine().toCharArray();
7.
8. int i = inputs.length - 1;
9. char[] outputs = new char[(inputs.length - 1) / 3 + 1];
10. int j = outputs.length - 1;
11. while (i > -1) {
12. int octal = 0;
13. for (int pb = 1; i >= 0 && pb < 8; pb *= 2) {
14. octal += pb * (inputs[i] - '0');
15. i--;
16. }
17. outputs[j--] = (char)(octal + 48);
18. }
19. System.out.println(String.valueOf(outputs));
20. }
21.}

결과

Alt text

반응형