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와 같은 조건을 굳이 넣지 않아도 되니 코드의 양이 많이 줄것으로 예상된다.