[백준] java 2745

Sundae·2023년 7월 16일
0

백준

목록 보기
5/63
post-custom-banner

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


문제

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

문제 접근 / 풀이 방법

시간이 오래 걸렸던 문제이다. 오래 걸린 이유는 진법에 관한 지식( 정의 , 변환법 )
등이 많이 모자랐기 때문이다.
평소 2 , 8 , 10 , 16 진수가 있다는 것은 알았지만, 구체적으로 어떻게 표기 되고 다른 진법으로 변환하는지는 알지 못했다.
https://m.blog.naver.com/icbanq/221727893563 를 참고했다.


위 이미지는 여러 진법을 10진수로 변환하는 방법이다.
N진수에 해당하는 숫자를 자릿수만큼 제곱하고 진수와 곱한다. 그리고 총합한다.


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

public class Main{
	public static void main(String[] args) throws IOException { 
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
        // B진법의 수 N
		String N = st.nextToken();
		int B = Integer.parseInt(st.nextToken());
        //변환된 수의 총합
		int sum = 0;
		
        // N의 길이 만큼 반복
		for(int i = 0; i < N.length(); i++) {
			
            //------자릿수 제곱을 구하는 구역-----//
            
			int sum3 = B;
			
			// i 가 0이면 sum3 = 1
			if( i == 0 ) 
				sum3 = 1;
				
			
			// 자리수 / i제곱을 sum3에 저장
			for(int j = 1; j < i; j++) {
				sum3 *= B;				
			}
			 //------자릿수 제곱을 구하는 구역 끝-----//
				
			
			// 자리수 i제곱값과 해당 인덱스 값의 곱을 sum에 더한다.
			if( i != 0) {								
				// 0이 들어있으면 계산하지 않음
				if(N.charAt(N.length()-i-1) != '0' ) {
					
					//만약 알파벳이 들어온다면 10부터 시작
					if(N.charAt(N.length()-i-1) > 57) 
						sum += sum3 * ( N.charAt(N.length()-1-i)- 'A' + 10);
					else 
						sum += sum3 * (N.charAt(N.length()-1-i)- '0');
											
				}						
			}
			
			// 0번째 자리수의 값은 1이므로
			if( i == 0 ) {
				
				if(N.charAt(N.length()-1) > 57) 
					sum += ( N.charAt(N.length()-1)- 'A' + 10);					
				else 							
					sum += N.charAt(N.length()-1)- '0' != 0 ? N.charAt(N.length()-1)-'0' : 0;
									
			}			
		}
		
		System.out.println(sum);
				
	}
}

배운점 / 느낀점

진법에 대해 좀 더 자세히 배우게 되었다.
작성한 코드를 개선하고 싶어 순위에 있는 소스코드와 비교해보았다.

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 in = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = new StringTokenizer(in.readLine(), " ");
		String n = st.nextToken();
		int b = Integer.parseInt(st.nextToken());
		int result = 0;
		int pow = n.length();
		for(int i=0;i<n.length();i++) {
			int now = n.charAt(i);
			if(now < 'A') { // number
				result += (now - '0')*(Math.pow(b, --pow));
			}else { // alpha
				result += (now - 'A' + 10)*(Math.pow(b, --pow));
			}
		}
		sb.append(result);
		System.out.print(sb);
	}
}

나도 위 코드같이 N제곱을 반환하는 메소드를(Math.pow) 사용하면 좋았을 것 같다.
이 메소드를 사용하면 i가 0와 같은 조건을 굳이 넣지 않아도 되니 코드의 양이 많이 줄것으로 예상된다.

profile
성장 기록 / 글에 오류가 있다면 댓글 부탁드립니다.
post-custom-banner

0개의 댓글