https://www.acmicpc.net/problem/1373
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 1373번 2진수 8진수
public class boj_3_1373 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String N = br.readLine();
// 세자리씩 끊었을 때 한 자리만 남았을 경우
if(N.length() % 3 == 1)
sb.append(N.charAt(0));
// 세자리씩 끊었을 때 두 자리만 남았을 경우
if(N.length() % 3 == 2)
sb.append((N.charAt(0) - '0') * 2 + (N.charAt(1) - '0'));
// 나머지 경우
for(int i = N.length() % 3; i < N.length(); i+=3) {
sb.append((N.charAt(i) - '0') * 4 + (N.charAt(i+1) - '0') * 2
+ (N.charAt(i+2) - '0'));
}
System.out.println(sb);
}
}
2진수로 8진수를 구하기 위해서 3자리씩 끊어 계산해야한다.
2진수의 자릿수가 3의 배수이면 괜찮지만 그렇지 않을 때를 대비하여 아래 과정을 추가했다.
// 세자리씩 끊었을 때 한 자리만 남았을 경우
if(N.length() % 3 == 1)
sb.append(N.charAt(0));
// 세자리씩 끊었을 때 두 자리만 남았을 경우
if(N.length() % 3 == 2)
sb.append((N.charAt(0) - '0') * 2 + (N.charAt(1) - '0'));
*N.charAt(i) 에 '0'을 빼준 이유
N.charAt(i)가 문자 1일 때 아스키 코드값은 49이다. 문자 0의 아스키코드값은 48이므로 숫자 1을 만들기 위해 그 둘을 빼준다.
나머지 경우는 반복문을 3씩 돌아 세자리수씩 처리하도록 한다.
// 나머지 경우
for(int i = N.length() % 3; i < N.length(); i+=3) {
sb.append((N.charAt(i) - '0') * 4 + (N.charAt(i+1) - '0') * 2
+ (N.charAt(i+2) - '0'));
}