티스토리 뷰

728x90
반응형

문제

 

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

 

풀이

 

즐거운 토요일. 빡센 문제보다는 쉬운 문제로 두어 개 풀고 딴짓하고 놀아야지~ 했다가 이 문제와 다음 문제에게 털렸다.

 

오히려 어줍잖게 알고리즘을 풀었던 경험 때문에 이상하게 꼬아서 풀고, 게다가 틀리기를 반복함.

 

문제는 별 거 없다. 말 그대로 규칙이 정해진 B진법 숫자를 10진법으로 변환하면 되는 문제다.

 

문제를 별 거 있게 만든 나의 습관이란, 일단 받아서 배열로 쪼갠 후 스트림을 열어서 처리하려고 했던 것.

 

그 와중에 숫자인지 알파벳인지도 효율적이지 못한 방법으로 나누려고 시도를 하다가 코드가 수상할 정도로 길어져서

 

다 지우고 다시 풀었다. 결국 내가 찾아낼 수 있던 가장 간단한 방법은 아래와 같다.

 

  • B진법 수 N을 문자열로 입력받는다.
  • 배열로 만들 거 없이 charAt()으로 끝에서부터 반복문을 돌며 10진법으로 변환해 준다.
  • 이 과정에서 숫자(0-9)인 경우에도 이상한 짓 하지 말고 얌전히 아스키코드로 다뤄준다.
  • 다 더해주면 끝!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Prob2745 {

	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());

		int sum = 0;

		for (int i = 0; i < n.length(); i++) {
			char c = n.charAt(n.length() - 1 - i);
			if ('0' <= c && c <= '9') {
				sum += (c - '0') * Math.pow(b, i);
			} else {
				sum += (c - 55) * Math.pow(b, i);
			}
		}

		System.out.println(sum);
	}
}

너무 어렵게 생각하지 말자..

 

다음 글에 계속.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함