더 많이 실패하기

백준 11576번 Base Conversion 자바 Java (☆공부 257일차) 본문

알고리즘/백준

백준 11576번 Base Conversion 자바 Java (☆공부 257일차)

김발자~ 2023. 4. 13. 22:58
반응형

11576 Base Conversion

https://www.acmicpc.net/problem/11576

 

11576번: Base Conversion

타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 500년 후의 세계로 여행을 떠나게 되었다. 500년 후의

www.acmicpc.net

 

 

 


백준 11576번 문제 Base Conversion


문제


 

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
2 초 256 MB 9335 5174 4395 56.044%

문제

타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 500년 후의 세계로 여행을 떠나게 되었다. 500년 후의 세계에서도 프로그래밍을 하고 싶었던 정이는 백준 사이트에 접속하여 문제를 풀기로 하였다. 그러나 미래세계는 A진법을 사용하고 있었고, B진법을 사용하던 정이는 문제를 풀 수가 없었다. 뛰어난 프로그래머였던 정이는 A진법으로 나타낸 숫자를 B진법으로 변환시켜주는 프로그램을 작성하기로 하였다. 

N진법이란, 한 자리에서 숫자를 표현할 때 쓸 수 있는 숫자의 가짓수가 N이라는 뜻이다. 예를 들어 N은 17일 때 한 자릿수에서 사용할 수 있는 수는 0, 1, 2, ... , 16으로 총 17가지가 된다.

입력

입력의 첫 줄에는 미래세계에서 사용하는 진법 A와 정이가 사용하는 진법 B가 공백을 구분으로 주어진다. A와 B는 모두 2이상 30이하의 자연수다.

입력의 두 번째 줄에는 A진법으로 나타낸 숫자의 자리수의 개수 m(1 ≤ m ≤ 25)이 주어진다. 세 번째 줄에는 A진법을 이루고 있는 숫자 m개가 공백을 구분으로 높은 자릿수부터 차례대로 주어진다. 각 숫자는 0이상 A미만임이 보장된다. 또한 수가 0으로 시작하는 경우는 존재하지 않는다.

A진법으로 나타낸 수를 10진법으로 변환하였을 때의 값은 양의 정수이며 220보다 작다.

출력

입력으로 주어진 A진법으로 나타낸 수를 B진법으로 변환하여 출력한다.

예제 입력 1

17 8
2
2 16

예제 출력 1

6 2

 

 

 


과정 생각해보기 & 오답


 

https://gimbalja.tistory.com/204

 

공부 118일차: 백준 11576번 Base Conversion 자바 java

11576 Base Conversion https://www.acmicpc.net/problem/11576 11576번: Base Conversion 타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머

gimbalja.tistory.com

4달 전에 푼 문제

 

A진법 수를 10진수로 변환하고, 그 수를 다시 B진법으로 변환하면 되는 문제이다

 

주의할 점이라면 이 방법을 생각해내는 것보다, 문제 이해가 조금 까다롭다는 정도일 듯하다

예제인

17 8

2

2 16

을 예시로 들면

세 번째 줄에 나타난 수들은 각 자리수이므로, 10진수로 바꾸면

2*17^1 + 16*17^0 = 2*17 + 16+ 1 = 50이 된다는 뜻임을 주의해야 한다

 

이전과 달리 스택이 아니라 StringBuilder로 풀어보려고 한다

 

 

 


정답 인정 코드


 

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
26
27
28
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st1 = new StringTokenizer(br.readLine());
        int m = Integer.parseInt(br.readLine());
        StringTokenizer st2 = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        
        int a = Integer.parseInt(st1.nextToken());
        int b = Integer.parseInt(st1.nextToken());
        
        int sum = 0;
        int idx = m-1;
        for(int i = 0; i < m; i++) {
            int n = Integer.parseInt(st2.nextToken());
            sum += n * Math.pow(a, idx);
            idx--;
        }
 
        while(sum != 0) {
            sb.insert(0, sum % b+" ");    // 앞에 넣으면 reverse() 필요 없음
            sum /= b;
        }
        
        System.out.println(sb);
        br.close();
    }
 
}
 
cs

 

 

 


시간에서 꽤 차이가 있다

반응형
Comments