ALGORITHM

[JAVA] 백준 1373번- 2진수 8진수

연듀 2022. 10. 21. 16:49

https://www.acmicpc.net/problem/1373

 

1373번: 2진수 8진수

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

www.acmicpc.net

 

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));
        String str = br.readLine();
        StringBuilder sb = new StringBuilder();

        int last = str.length() % 3;

        for(int i=str.length()-1; i>=0; i -=3){
            int sum = 0;

            if(i==last - 1){
                if(last==1) sum += str.charAt(i)-'0';
                else sum += (str.charAt(i)-'0') + (str.charAt(i-1)-'0') * 2;
            }
            else{
                sum += (str.charAt(i)-'0') + (str.charAt(i-1)-'0') * 2 + (str.charAt(i-2)-'0') * 4;
            }
            sb.append(sum);
        }
        System.out.println(sb.reverse());

    }
}

 

수학적으로 2진수를 8진수를 바꾸는 방법을 몰라 찾아봤다.

예제로 설명하면 11, 001, 100 이런식으로 뒤에서부터 세자리씩 묶은 값에 2의 0승, 2의 1승, 2의 2승을 각각 곱하여 더한 값들을 모두 더하면 8진수로 변환이 된다.

입력받은 수를 뒤에서부터 3자리씩 묶어 마지막 숫자가 남을 때와 남지 않고 딱 3으로 나눠 떨어지는 경우를 나눠 sum을 계산해 주었다.

 

이 때 주의해야할 점은 숫자형 문자를 charAt으로 추출하면 char형이므로 계산시에 int 형으로 변환하면 아스키코드로 반환된다.

따라서 charAt(i)-'0' 을 해준다.