두 수 N과 B를 입력받고 B진법 수 N을 10진법으로 변환해서 출력해 주는 프로그램을 작성한다.
이게 아마 중학수학 과정에 있었던 내용이었던 거 같기도 한데.. 진법 변환은 컴퓨터 구조나 c언어 보수 어쩌고 저쩌고 하면서도 다루게 된다.
2진법을 예로 들자면 1010을 10진법으로 변환하기 위해서는
2진수 | 1 | 0 | 1 | 0 |
자릿수 | 2^3 | 2^2 | 2^1 | 2^0 |
10진수 | 8 | 4 | 2 | 1 |
1010을 오른쪽 부터 자릿수를 곱하고 전체를 더하면 된다. 즉 2진수 곱하기 10진수를 하면 된다.
그렇게 계산하면
(1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (0 * 2^0)
= 8 + 0 + 2 + 0
= 10
전개해서 10이 된 것을 알 수 있다.
그러면 위에 문제를 풀 때 규칙을 적용시켜 보면 숫자 N에 맨 오른쪽 수부터 첫 번째 자리에는 1을 곱하고 두 번째 자리부터는 B진법이므로 B를 곱해서 1* B를 곱하고 그다음 수에는 1*B*B를 곱하면 된다.
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
|
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String n = sc.next();
int b = sc.nextInt();
int tmp = 1;
int result = 0;
for(int i=n.length()-1; i >= 0; i--) {
char c = n.charAt(i);
if('0' <= c && c <= '9') {
result += (c - 48) * tmp;
} else {
result += (c - 55) * tmp;
}
tmp *= b;
}
System.out.println(result);
}
}
|
cs |
12행 : for문을 n.length() - 1 부터 시작하여 맨 오른쪽 수부터 처리할 수 있게 한다.
15행 : 문자열에서 추출한 문자가 0~9 사이면 48을 빼서 tmp를 곱해주고 그 이외(A~Z) 면 55를 마이너스해주고 tmp를 곱해준다.
그 이유는 추출한 c 문자가 int형식의 수가 아니라 문자이기 때문에 '3' * 1 이런식으로 문자와 수를 곱하게 되면 원하는 수가 도출되지 않는다. 48인 이유는 문자 '0'의 아스키코드값이 48이기 때문에 48을 빼줬다.
마찬가지로 'A'의 아스키코드값은 65인데 10부터 A를 의미하므로 55만 마이너스 해준다.
'프로그래밍 > 백준 알고리즘 코드' 카테고리의 다른 글
[백준] 2720번 JAVA 세탁소 사장 동혁 - 일반 수학 1 (0) | 2024.08.01 |
---|---|
[백준] 11005번 JAVA 진법 변환 2 - 일반 수학 1 (0) | 2024.07.31 |
[백준] 2563번 JAVA 색종이 - 2차원 배열 (1) | 2024.01.26 |
[백준] 10798번 JAVA 세로읽기 - 2차원 배열 (0) | 2024.01.16 |
[백준] 2566번 JAVA 최댓값 - 2차원 배열 (0) | 2024.01.15 |
댓글