728x90
반응형
SMALL
📌 문제 정보
- 출처: 문제 링크
- 난이도: ⭐
- 문제 유형: 배열
- 사용 언어: Java
🔍 문제 설명
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진법으로 출력한다.
💡 풀이 노트
진법 변환이란?
어떤 수를 특정 진법(기수법)에 따라 다른 형태로 표현하는 것을 말한다.
예를 들어, 16진수(HEX) `"1A"` 는 1X16^1 + 10X16^0 = 26 이 된다.
문자 `'A'` 는 16진수에서 10을 의미하며, 진법에 따라 `'A' ~ 'Z'` 는 `10 ~ 35` 까지 나타낼 수 있다.
추가 예시)
8진수 → 10진수 변환 `'271'` = 2X8^2 + 7X8^1 + 1X8^0 = 185
10진수 → 2진수 변환 `'20’` = 1X2^4 + 0X2^3 + 1X2^2 + 0X2^1 + 0X2^0
public static double to_number(String str, int n){
double sum = 0;
int power = str.length() - 1;
for(char c : str.toCharArray()) {
if (Character.isDigit(c))
sum += (c - '0') * Math.pow(n, power--);
else
sum += (c - 55) * Math.pow(n, power--);
}
return sum;
}
- `int power = str.length() - 1;`
- 진법 변환은 가장 앞자리가 가장 큰 자릿수이므로, 가장 높은 지수부터 시작
- 예: `'1A'` → `'1'` 은 16^1, `'A'` 는 16^0
- `for(char c : str.toCharArray())`
- 문자열을 문자 배열로 변환하여 하나씩 순회
for(char c : str.toCharArray()) {
if (Character.isDigit(c))
sum += (c - '0') * Math.pow(n, power--);
else
sum += (c - 55) * Math.pow(n, power--);
}
- `if (Character.isDigit(c))`
- 문자가 숫자(`0`~`9`)일 경우 `c - '0'`로 해당 숫자 값 얻기
- `else`
- 숫자가 아니라면 `A~Z`까지에 해당하는 숫자를 구함
- 문자가 알파벳(`A~Z`)인 경우, ASCII 값 기준으로 `A`는 65이므로 `c - 55`를 통해 `10`부터 시작하는 값을 얻음 예: `'A' - 55 = 65 - 55 = 10`
- `Math.pow(n, power--)`
- 해당 자리수의 가중치 계산: 진법의 거듭제곱 (예: `n^2`, `n^1`, ..., `n^0`)
- 각 자릿수의 값 × 가중치를 더해 최종 10진수 값 계산
🚀 코드 (Java)
import java.io.*;
import java.util.*;
public class Main{
public static double to_number(String str, int n){
double sum = 0;
int power = str.length() - 1;
for(char c : str.toCharArray()) {
if (Character.isDigit(c))
sum += (c - '0') * Math.pow(n, power--);
else
sum += (c - 55) * Math.pow(n, power--);
}
return sum;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String str = st.nextToken();
int n = Integer.parseInt(st.nextToken());
System.out.printf("%.0f",to_number(str, n));
}
}
🖥 실행 결과
입력
ZZZZZ 36
출력
60466175
📌 깃허브 코드 저장소: https://github.com/glorypang/CodingTest
728x90
반응형
LIST