BOJ 11005 진법 변환 2
- 문제 링크
https://www.acmicpc.net/problem/11005
- 문제 해설
10진수를 어떻게 진법 변환해주는지를 알아야한다.
간단하게 10진수 10을 2진수로 나타낸다고 해보자.
- 10을 2로 나눈다. 몫이 5이고 나머지가 0이다.
- 몫 5를 2로 나눈다. 몫이 2이고 나머지가 1이다.
- 몫 2를 2로 나눈다. 몫이 1이고 나머지가 0이다.
- 몫 1을 2로 나눈다. 몫이 0이고 나머지가 1이다.
- 몫이 0이 되면 나눠주는 행위를 그만두고, 나머지를 최종 나머지부터 처음 순으로 써준다. ex) 10 = 1010(2진수)
위 예시에서는 2진수라서 2로 나눠주었지만, n진수라면 n으로 나누어주면 된다.
문제에서 숫자를 표현할 떄 0~9까지는 그대로 이용하지만, 10~35까지는 A~Z를 이용하여 표현한다.
문제를 쉽게 해결하고자 한다면 아스키 코드를 이용하여 정수형과 문자열을 다루는 법을 알아야한다.
진법 변환을 해야하므로 위에서 설명한 것처럼 나머지들을 저장하여 써줘야한다. String을 이용하여 저장하였다.
나머지가 만약 0~9사이라면 그대로 표현한다. 그런데 이 때, 나머지는 int형이고 이것들을 String에 저장할 것이므로 적절하게 형변환을 해주어야한다. 나머지에다가 아스키 코드에서 문자 '0'에 해당하는 10진수를 더해주면, 나머지와 대응되는 문자의 10진수 값을 얻을 수 있다. 그 값을 char형으로 변환해줘서 String의 한 글자로 넣어주면 된다.
나머지가 10~35사이라면 알파벳을 이용하여 표현한다. 위와 비슷한 방식으로 (나머지-10)에다가 아스키 코드에서 문자 'A'에 해당하는 10진수를 더해주면, 나머지와 대응되는 문자의 10진수 값을 얻을 수 있다. 그 값을 char형으로 변환해줘서 String의 한 글자로 넣어주면 된다.
위에서 설명한 진법 변환 방식은 나머지들을 최종 나머지부터 처음 순으로 써주었는데, 코드에서 String에 처음 나머지에서 최종 순으로 저장하였다. 그래서 마지막에 출력할 때 뒤집어서 출력해준다.
- 코드 보기
import java.io.*;
import java.util.*;
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));
StringTokenizer st = new StringTokenizer(br.readLine());
long n = Long.parseLong(st.nextToken());
int b = Integer.parseInt(st.nextToken());
String str = "";
while (n > 0)
{
int r = (int) n % b;
if (r < 10)
str += (char) (r + (int) '0');
else
str += (char) (r - 10 + (int) 'A');
n /= b;
}
char[] ans = new char[str.length()];
for (int i = str.length() - 1; i >= 0; i--)
{
ans[i] = str.charAt(i);
bw.write(Character.toString(ans[i]));
}
br.close();
bw.flush();
bw.close();
}
}
'PS > BOJ' 카테고리의 다른 글
BOJ 1978 소수 찾기 [Java] (0) | 2021.08.01 |
---|---|
BOJ 2745 진법 변환 [Java] (0) | 2021.08.01 |
BOJ 9613 GCD 합 [Java] (0) | 2021.07.27 |
BOJ 1850 최대공약수 [Java] (0) | 2021.07.26 |
BOJ 2609 최대공약수와 최소공배수 [Java] (0) | 2021.07.26 |