반응형

[문제 풀이][Java]  백준 2745번 진법 변환

* 학습 목적의 게시물이나 혹시 이 게시물이 문제가 된다면 언제든 연락 부탁드립니다.

* 더 나은 풀이를 위한 훈수, 조언 등 모두 환영합니다!

문 제 

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진법으로 출력한다.

[문제 링크] 백준 2745번 진법 변환


문제 해석

  • B진법 수는 String으로 받고, 변환된 진법 수는 10억 이하임으로 int로 받는다.
  • 진수 변환법을 적용한다.

해결 방법

  • N진법은 M자리수를 10진법으로 변환하는 방법은 아래와 같다.
    • 각 자리의 수는 1부터 최대 35까지이며 두 자리수인 10부터는 A로 시작하여 35는 Z로 표현한다. ex) 36진수 ZAV5
    • 1의 자리를 0으로 시작하여 N에 M-1 ~ 0 제곱한 수에 각 자리수를 곱한 수를 더한 값이 10진수이다.
    • 예시) 36진수 ZAV5
    • (36^3 * 35) + (36^2 * 10) + (36^1 * 31) + (36^0 * 5) = 1647041
  • 주어진 B진법 수를 String으로 받아 char Array로 변환한다.
  • 반복문으로 배열의 요소를 확인해가며 1~Z에 맡는 숫자로 변환한다.
  • 위 변환법을 적용한다.

참고사항

  • 추가 공부 필요내용 : Map, String to char Array, 진수 변환법

전체 코드

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

public class Main {
	
	static int convertToDecimal (String givenNum, int arithmetic) {	
		HashMap<String, Integer> table = new HashMap<>();
		table.put("0", 0);table.put("1", 1);table.put("2", 2);table.put("3", 3);
		table.put("4", 4);table.put("5", 5);table.put("6", 6);table.put("7", 7);
		table.put("8", 8);table.put("9", 9);table.put("A", 10);table.put("B", 11);
		table.put("C", 12);table.put("D", 13);table.put("E", 14);table.put("F", 15);
		table.put("G", 16);table.put("H", 17);table.put("I", 18);table.put("J", 19);
		table.put("K", 20);table.put("L", 21);table.put("M", 22);table.put("N", 23);
		table.put("O", 24);table.put("P", 25);table.put("Q", 26);table.put("R", 27);
		table.put("S", 28);table.put("T", 29);table.put("U", 30);table.put("V", 31);
		table.put("W", 32);table.put("X", 33);table.put("Y", 34);table.put("Z", 35);
		
		int decimalNum = 0;
		String[] numChar = givenNum.split("");
		for (int i = 0; i < numChar.length; i++) {
			int powerOfN = numChar.length - 1 - i;
			decimalNum += (Math.pow(arithmetic, powerOfN)) * table.get(numChar[i]);;
		}
		
		return decimalNum;
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		String givenNum = st.nextToken();
		int arithmetic = Integer.parseInt(st.nextToken());
		int answer = convertToDecimal(givenNum, arithmetic);
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write(String.valueOf(answer));
		bw.flush();
		br.close();
		bw.close();
	}
}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기