[백준, 자바] 11576번 - Base Conversion

jinvicky·2024년 4월 19일
0

ALG

목록 보기
29/62
post-thumbnail
import java.io.*;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer conversionTokens = new StringTokenizer(br.readLine());
        int future = Integer.parseInt(conversionTokens.nextToken()); // 미래 진법
        int current = Integer.parseInt(conversionTokens.nextToken()); // 현재 진법
        int T = Integer.parseInt(br.readLine()); // 들어올 숫자의 개수
        StringTokenizer numberTokens = new StringTokenizer(br.readLine()); // 숫자들이 적힌 line
        int result = 0; // 미래 진법을 10진법으로 바꾼 값을 담은 변수

        for (int i = T -1; i >=0; i--) {
            int number = (int) (Math.pow(future, i) * Integer.parseInt(numberTokens.nextToken()));
            result += number;
        }

        // 8진법으로 바꿔야지 이제
        StringBuilder sb = new StringBuilder(); // sb로 바꾼다.
        Stack<Integer> stack = new Stack<>();
        while(result > 0) {
            // 8로 나눈 나머지를 sb에 더한다.
            stack.push(result % current);

            // result를 8로 나눈다.
            result /= current;
        }

        while (!stack.isEmpty()) sb.append(stack.pop()).append(" ");

        System.out.println(sb);
    }
}

두번째 줄에 나오는 숫자의 자리수의 개수가 조건문에 쓰일 key다.
=> 3번째 줄에 몇개의 숫자가 올 것인가이다. (이것도 헤맸다)

굉장히도 멍청했다.

10진법으로 바꾸려면 어떻게 하는가?
=> Math.pow(현재 진법, 자릿수) * 자릿수별 숫자

100을 10진법으로 바꾼다고 한다면?
=> (2^2)1 + (2^1)0 + (2^0)*0이 된다.

Math.pow의 첫번째에 현재 진법을 넣는 것인데 10진법 넣어버림.

그리고 16을 나는 한번 더 내부에서 쪼갰는데 16을 마치 한 자릿수처럼 취급해야 했다. 그 부분에서 또 틀림.

이해가 가지 않았던 점은 10진수에서 8진수로 바꾸면서 왜 자릿수별로 띄어쓰기를 해서 출력하는 것인가였다.

저 미래 진법이라는 것을 당초 이해할 수가 없었다;;

또 출력할 때 무언가 형식이 틀렸나보다. 아마 마지막에 띄어쓰기가 들어가면 안되는데 들어가서가 아닐까 추측해본다.
그래서 stack을 사용하는 것으로 고쳤더니 드디어 맞았다.

  • 문자열을 reverse() 해야 하는 경우 stack을 쓰면 고민거리가 줄어든다.

대충 실패한 원인

  • 16은 두 자리가 아니라 미래 진법으로 한 자리다.
  • 진법 변환할 때 Math.pow()에 미래 진법과 i가 들어가야 한다.
  • 띄어쓰기 고려할 때 stack에 while문 써보자고.
profile
일단 쓰고 본다

0개의 댓글