전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

PS/BOJ

BOJ 11005 진법 변환 2 [Java]

2021. 7. 27. 07:39

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
    'PS/BOJ' 카테고리의 다른 글
    • BOJ 1978 소수 찾기 [Java]
    • BOJ 2745 진법 변환 [Java]
    • BOJ 9613 GCD 합 [Java]
    • BOJ 1850 최대공약수 [Java]
    모달조아
    모달조아

    티스토리툴바