백준 2745 진법 변환[JAVA]

Ga0·2023년 3월 30일
1

baekjoon

목록 보기
12/123

  • 오늘 포스트할 문제는 2745 진법 변환 문제이다.
  • 개인적으로 조금 어려웠다...

문제 해석

  • 콘솔로 부터 값(N)을 입력 받고, 입력받은 값이 몇진법(B)인지도 같이 입력받는다.
  • 그리고 B진법의 값(N)의 값을 10진법으로 바꿔 출력한다.
  • 문제가 요구하는 바는 간단하지만, 그 과정이 나에겐 조금 어려웠던 것 같다.
  • 이 문제를 풀기 앞서, 값을 10진수로 바꾸는 로직을 이해해야한다!
    <로직>
    • 이해하기 쉽게 예시를 16로 들자
    • 위의 사진을 보면 더 쉽게 이해할 수 있다.
    • 10진법에서 10은 10이지만 16진법에서 10은 A이다.
    • 이러한 방식으로 입력받은 값은 i번째 인덱스의 문자가 0~9이면 그대로 받아서 해당 값과 자리수(B의 i승)을 곱해서 값을 누적 더하기를 하면 된다.

틀린 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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

        String N = st.nextToken(); //B진법의 값인 N
        int B = Integer.parseInt(st.nextToken()); //몇 진법인지
        br.close();

        //ex) 2진법인 경우 2^0 2^1 2^2 ... 곱하는 것처럼
        int tmp = 1; // 몇진법인지 알기 위해서는 각 문자마다 해당 자리 수 B만큼 곱해주어야한다.
        int sum = 0; // 마지막에 출력할 숫자를 의미

        //10진법으로 구하기 전에 문자열 하나하나가 각 수를 의미하므로 문자열을 문자로 변환해줘야한다.(하나씩 끄집어내기!)
        for(int i = 0; i < N.length(); i++){
            char C = N.charAt(i);

            if('0' <= C && C <= '9'){ //아스키 코드값으로 숫자의 범위를 비교
                sum += (C - '0') * tmp;
            }else{
                sum += (C- 'A' + 10) * tmp; //10부터 A이기 때문에 10을 더해준다
            }
            tmp*= B; //자리수가 한칸씩 왼쪽으로 간다는 것은 완쪽으로 B곲하기 한 것과 같다
        }

        System.out.println(sum);
    }
}

결과

  • "틀렸습니다." 가 떴다.

-> 엄청난 실수였다.

  • 자리수를 왼쪽부터 세어 계산하고 있었다!
  • 일의 자리수(즉, 맨 오른쪽부터) B의 0승이 시작되는 것인데 왼쪽부터 하니 문제가 났던 것이다.
  • 이걸 바로 발견하지 못한 것은, 예시가 ZZZZZ에 36인데 ZZZZZ가 모두 같은 Z여서 결과값은 같게 나온다. 그래서 발견하지 못한 것...

맞은 코드

import java.io.*;
import java.util.StringTokenizer;

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

        String N = st.nextToken();
        int B = Integer.parseInt(st.nextToken());
        br.close();

        int tmp = 1;
        int sum = 0;

        for(int i = N.length()-1 ; i >= 0; i--){ // 여기서, 맨오른쪽 부터 계산!
            char C = N.charAt(i);
            
            if ('A' <= C && C<= 'Z') {
                sum += (C - 'A' + 10) * tmp;
            } else {
                sum += (C - '0') * tmp;
            }
            tmp *= B;
        }

        System.out.println(sum);
    }
}

결과

느낀점

  • 진짜 충격받은 문제이다. 너무 당연한 것인데 코드를 칠땐 전혀 생각도 못하고 있었다...
  • 앞으로는 코드 좀 꼼꼼히 쳐야겠다...

0개의 댓글