본문 바로가기
백준 문제 풀이/일반 수학 1

(#11005 Java) 진법 변환 2

by _비니_ 2024. 2. 26.

 

문제 이해

 

이 문제는 바로 전에 푼 진법 변환1과 정확히 반대되는 문제이다. 

이전 문제는 B진법을 10진수로 변환해서 출력하는 문제였는데.. 이번엔 10진수를 B진수로 변환해 출력하면 된다.

 

한 블로그에서 변환 방법을 그림으로 설명해놓은 것을 보았는데, 코드로 푸는 데에도 이해가 쉬워 나도 해보았다.

 

 

문제 해결

 

N과 B를 입력받을 스캐너 객체를 만들어준다.

Scanner in = new Scanner(System.in);

int N = in.nextInt();
int B = in.nextInt();

 

 

그리고 최종적으로 출력할 나머지들을 저장해줄 리스트도 선언해준다.

이 리스트를 선언해줄 때 주의해야할 점은 'Character' 타입으로 만들어주어야 한다는 점이다!!

ArrayList<Character> list = new ArrayList<>();

 

 

그리고 위의 그림에서 풀이한 방식대로 코드를 풀어가보자.

몫이 0보다 큰 경우동안 반복문을 수행해주는데, 이 때 나머지가 10보다 작은 경우와, 크거나 같은 경우로 나누어서 코드를 짜야한다. 이유는 숫자를 그대로 출력하느냐, 알파벳으로 출력하냐가 다르기 때문이다.

 

둘 다 리스트에 넣어주어야 하므로 char형으로 변경해야하므로 숫자 그대로 출력해야할 경우, +'0'를 해주어야 하고, 

알파벳으로 출력해야할 경우 +55를 해주어야 한다. ==> 이에 대한 설명은 진법 변환 1 포스터에서 자세히 설명해놓았다. 정확히 숫자->문자와 문자->숫자의 반대라고 생각하면된다.

 

그리고 반복문 안에서 B로 나눈 몫 N을 갱신해준다.

while (N > 0) { //몫이 0보다 큰 경우
    if (N % B < 10) { //나머지가 10보다 작을 경우
        list.add((char) (N % B + '0')); //숫자 그대로 출력 (문자열 리스트에 추가해야 하므로 '0' 더해줌)
    } else { // 10보다 크거나 같을 경우
        list.add((char) (N % B + 55)); //문자(알파벳)로 출력
    }
    N /= B; // B로 나눈 몫 갱신
}

 

 

그리고 거꾸로 출력해주어야하므로, list의 size보다 1작은 것부터 시작해서 거꾸로 출력해주기!! (인덱스 번호)

for (int i = list.size() -1; i >=0; i--) { //거꾸로 출력해야 하므로
    System.out.print(list.get(i));
}

 

 

최종 코드

 

import java.util.ArrayList;
import java.util.Scanner;

public class NumeralSystemTransformation2 {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int N = in.nextInt();
        int B = in.nextInt();

        ArrayList<Character> list = new ArrayList<>();

        while (N > 0) { //몫이 0보다 큰 경우
            if (N % B < 10) { //나머지가 10보다 작을 경우
                list.add((char) (N % B + '0')); //숫자 그대로 출력 (문자열 리스트에 추가해야 하므로 '0' 더해줌)
            } else { // 10보다 크거나 같을 경우
                list.add((char) (N % B + 55)); //문자(알파벳)로 출력
            }
            N /= B; // B로 나눈 몫 갱신
        }

        for (int i = list.size() -1; i >=0; i--) { //거꾸로 출력해야 하므로
            System.out.print(list.get(i));
        }

        in.close();
    }
}

 

 

그리고 진짜 어이없게 실수 많이하는 것 중에 하나가 마지막에 print가 아니라 println으로 쓰는 거........너무 습관처럼 쓰는데.. 꼭 확인하고 제출하자,,,,!!

반응형

'백준 문제 풀이 > 일반 수학 1' 카테고리의 다른 글

(#2903 Java) 중앙 이동 알고리즘  (0) 2024.02.27
(#2720 Java) 세탁소 사장 동혁  (0) 2024.02.27
(#2745 Java) 진법 변환  (0) 2024.02.26