728x90
반응형
문제: https://www.acmicpc.net/problem/2745
문제 접근
이번 문제는 진법 계산하는 법만 안다면 그다지 어렵지 않은 문제였습니다!
그래서 문제 접근 방식을 설명드리는 것보다는 N진법을 10진법으로 바꾸는 방법을 설명해드리겠습니다.
어떤 진법으로 된 수라도 10진수로 변환하는 법은 똑같습니다!
각 자리의 수에 해당 단위의 값을 곱해서 더하면 됩니다! 글로 봐서 이해가 잘 안되실 수도 있는데 10진수 1029 라는 숫자를 예시로 들어보겠습니다! 1029를 풀어서 쓰면 다음과 같습니다:
이번에는 2진수 1010을 10진수로 변환해보겠습니다:
즉, N진수를 10진수로 변환하고 싶다면 가장 우측에 있는 수부터 차례로 N^0, N^1,N^2, ..., N^n을 곱하고 더해주면 됩니다!
단 9를 초과하는 수는 문제와 같이 알파벳으로 숫자를 표현한답니다! 그래서 알파벳이 있는 경우에는 "알파벳 -> 10진수"로 변환한 후, 문제를 풀어야 합니다. 마지막으로 16진수 64F를 10진수로 변환해보겠습니다:
제가 느꼈을 때 이 문제에서 포인트는 2가지였던 것 같습니다.
- 진법 변환을 이해해야 한다.
- 알파벳은 숫자로 어떻게 변환할 것인지?
전체 코드
import java.io.*;
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));
String input = br.readLine();
String num = input.split(" ")[0];
int base = Integer.parseInt(input.split(" ")[1]);
int sum = 0;
int n = 0;
int j = 0;
for(int i = num.length() - 1; i >=0; i--) {
if(base >= 10 && (num.charAt(i) >= 'A' && num.charAt(i) <= 'Z')) {
n = num.charAt(i) - 55; // 'A'의 아스키 코드: 65
sum += (int)Math.pow(base, j) * n;
}else{
sum += (int)Math.pow(base, j) * Integer.parseInt(String.valueOf(num.charAt(i)));
}
j++;
}
bw.write(sum + "\n");
bw.flush();
}
}
만약 코드를 보고 이해 안되는 부분이 있다면 댓글 남겨주세요!
혹은 더 좋은 방법이 있다면 알려주세요!
저는 바보라서 조금 비효율적으로 푼 거 같습니다..ㅎㅎ;;
이번 글도 읽어주셔서 감사합니다!
728x90
반응형
'Java > 코딩테스트' 카테고리의 다른 글
[백준] 2903번: 중앙 이동 알고리즘 (JAVA) (0) | 2025.04.03 |
---|---|
[백준] 2720번: 세탁소 사장 동혁 (JAVA) (0) | 2025.04.03 |
[백준] 11005번: 진법 변환2 (JAVA) (0) | 2025.04.02 |
[백준] 10798번: 세로읽기 (JAVA) (0) | 2025.04.02 |
[백준] 2563번: 색종이 (JAVA) (0) | 2025.04.01 |