이전의 문제를 뒤집은 문제이다.
이번에는 10진법의 수 N이 주어지고 이 숫자가 B 진법에서 어떤 수인지 출력하는 프로그램을 작성하는 문제이다.
우선 진법 변환의 단계에 대해서 알아보자.
10진법을 다른 진법으로 변환하는 것은 다음과 같다.
예를 들어 10진수를 25진수로 바꾼다고 가정할 때
1. 변환하려는 진법의 기수를 정한다. 여기서는 25진수를 변환하므로 기수는 25가 된다.
2. 10진수를 변환하려는 진법의 기수로 나눈 몫과 나머지를 계산한다.몫은 다음 계산의 기준이 되며, 나머지는 현재 자리의 값으로 사용된다.
3.나머지를 해당 진법에서 사용하는 숫자로 변환한다. 25진수에서는 0부터 24까지의 숫자가 사용되므로 숫자 10부터는 알파벳 대문자 A부터 사용 된다.
4.나머지를 변환한 값을 앞에서부터 순서대로 나열하여 결과를 얻는다.
5.몫이 0이 될 때까지 위의 과정을 반복한다.
따라서, 로직 자체는 크게 어렵지 않으며 반복문을 통하여 나머지 값을 계산해 주면 된다.
나는 처음에 다음과 같이 로직을 구성하였다.
import java.io.*;
import java.util.*;
class Main{
public static int n,b,temp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
StringBuilder sb = new StringBuilder();
while(n/b>1)
{
temp = n%b;
n = n / b;
if (temp > 9) {
temp += 55;
sb.append((char)temp);
} else {
sb.append(temp);
}
}
temp = n%b;
if (temp > 9) {
temp += 55;
sb.append((char)temp);
} else {
sb.append(temp);
}
System.out.println(sb.toString());
}
}
입력 값을 받아서 나머지를 계산하고, 마지막 나머지를 반복문 이후에 처리하여 출력하도록 하였다.
그런데 제출을 해보니 실패한 것으로 나왔는데...
반례를 생각해보니 아주 간단한 이유였다.
변환을 해줄때 index가 반대로 흘러야 하는데 나는 그냥 append로 붙여버렸으므로 역순으로 출력이 되는것
예를 들어 100을 25진수로 출력한다고 할때 실제 값은 40이 나와야하는데, 나는 첫 반복에서 temp가 0이므로 04가 출력되게 된다.
이것을 처리하기 위해서 마지막 출력 단계에서 reverse() 메서드를 이용하여 출력을 반대로 뒤집어 주었다.
while(n/b>=1)
{
temp = n%b;
n = n / b;
if (temp > 9) {
temp += 55;
sb.append((char)temp);
} else {
sb.append(temp);
}
}
temp = n%b;
if (temp > 9) {
temp += 55;
sb.append((char)temp);
} else {
sb.append(temp);
}
System.out.println(sb.reverse().toString());
}
계산은 동일하고, 출력 부분의 코드만 수정하니 제대로 잘 나오는 것을 확인 할 수 있었다.
다른 사람이 작성한 코드를 보다가 지나치게 짧은 코드가 있어서 확인해 보았는데...
System.out.println(Integer.toString(scan.nextInt(), scan.nextInt()).toUpperCase());
사실 위의 문제는 다음 한줄로 처리가 가능했다.
Integer의 toString메서드가 첫번째 입력값을 두번째 입력값에 진법으로 변환해주기 때문에 사실 반복문 없이 바로 출력이 가능했던것...
긴 코드를 아주 간단하게 구현한 좋은 예시 인것 같다.
'JAVA > 코딩 테스트' 카테고리의 다른 글
백준 문제 풀이 - 브루트 포스 단계 - 2213번 분해합 (브론즈 2) (0) | 2023.09.01 |
---|---|
백준 문제 풀이 - 약수, 배수와 소수 단계 - 11653번 소인수분해 (브론즈 1) (1) | 2023.08.27 |
백준 문제 풀이 - 일반 수학 1단계 - 2745번 진법 변환 (브론즈 2) (0) | 2023.08.23 |
백준 문제 풀이 - 2차원 배열 단계 - 2563번 색종이 (실버 5) (0) | 2023.08.23 |
백준 문제 풀이 - 2차원 배열 단계 - 2738번 행렬 덧셈 (브론즈 5) (0) | 2023.08.19 |