ALGORITHM

백준 2745 진법 변환 [JAVA]

Adev 2024. 1. 4. 15:54

리뷰

성공

  • char타입 계산 실수가 여러번 있었다.

 
공부한 것

  • 제곱 메소드 : Math.pow(double A, double B) = A의 B승
  • char타입 값이 숫자인지 확인하는 메소드 : boolean Character.isDigit(char C)
  • char타입 연산 방법 정리
//주요 아스키코드

문자       <-> ASCII CODE
0          <-> 48
A          <-> 65
a          <-> 97
//char타입 비교 시 따옴표 붙이기

n.charAt(i) == 1 //(x)
n.charAt(i) == '1' //(o)
//char타입 숫자를 int로 변환하려고 할 때, (int)를 붙이면 아스키코드 값이 반환된다. 
//char타입 숫자 - '0' 을 하면 유니코드로값으로 연산 후 10진수와 동일한 값을 반환한다.

arrn[i] = (int)n.charAt(i); //(x)
arrn[i] = n.charAt(i) - '0'; //(o)
arrn[i] = n.charAt(i) - 48; //(o)

 

문제

더보기

문제

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

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

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

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

출력

첫째 줄에 B진법 수 N을 10진법으로 출력한다.

예제 입력 1 복사

ZZZZZ 36

예제 출력 1 복사

60466175

 

내 답안

1.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer token = new StringTokenizer(br.readLine());
		String n = token.nextToken();
		int b = Integer.parseInt(token.nextToken());
		int result = 0;
		int arrresult[] = new int[n.length()];
		ArrayList<Integer> list = new ArrayList<>();
		int arrn[] = new int[n.length()];
		for (int i = n.length() - 1; i >= 0; i--) {
			list.add((int) Math.pow(b, i));
		}
		for (int i = 0; i < n.length(); i++) {
			if (n.charAt(i) == '0' || n.charAt(i) == '1' || n.charAt(i) == '2' || n.charAt(i) == '3'
					|| n.charAt(i) == '4' || n.charAt(i) == '5' || n.charAt(i) == '6' | n.charAt(i) == '7'
					|| n.charAt(i) == '8' || n.charAt(i) == '9') {
				arrn[i] = n.charAt(i) - '0';
			} else {
				arrn[i] = n.charAt(i) - '7';
			}
		}
		for (int i = 0; i < n.length(); i++) {
			arrresult[i] = arrn[i] * list.get(i);
		}
		for (int k : arrresult) {
			result += k;
		}
		bw.write(result + "\n");
		bw.flush();
	}
}

 
2. 리팩토링 - Character.isDigit() 사용, 차수를 1씩 감소시키는 for문 제거 후 단일 증감문으로 대체.

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer token = new StringTokenizer(br.readLine());
		String n = token.nextToken();
		int b = Integer.parseInt(token.nextToken());
		int result = 0;
		int arrn[] = new int[n.length()];
		int degree = n.length() - 1;
		for (int i = 0; i < n.length(); i++) {
			if (Character.isDigit(n.charAt(i))) {
				arrn[i] = n.charAt(i) - '0';
			} else {
				arrn[i] = n.charAt(i) - '7';
			}
			result += arrn[i] * (int) Math.pow(b, degree--);
		}
		bw.write(result + "\n");
		bw.flush();
	}
}