백준 21275 [자바] java 폰 허석만
문제 링크: https://www.acmicpc.net/problem/21275
21275번: 폰 호석만
만약 문제의 조건에 맞는 X, A, B가 유일하게 존재한다면, X를 십진법으로 표현한 수와 A와 B를 공백으로 나누어 출력하라. 만약 만족하는 경우가 2가지 이상이라면 "Multiple"을, 없다면 "Impossible"을
www.acmicpc.net
▶문제
폰 호석만은 진법 변환의 달인이다. 어떤 진법의 수가 주어져도 모든 다른 진법으로의 변환이 가능한 폰 호석만은 새로운 문제를 내기로 했다. 폰 호석만이 내는 문제는 다음과 같이 진행된다.
먼저 폰 호석만은 수 3개 X, A, B를 결정한다(0 ≤ X < 263, 2 ≤ A ≤ 36, 2 ≤ B ≤ 36, A ≠ B). 이 때 X는 10진법이다. 그 다음에 X를 A진법으로 표현한 수와 B진법으로 표현한 수를 종이에 써 놓는다.
그 다음에 종이에 써져 있는 두 개의 수를 여러분에게 보여주게 된다. 주어진 두 개의 수를 통해 원래 숫자인 X, A, B를 계산해주자. 만약 조건을 만족하는 (X, A, B)로 가능한 조합이 여러 개라면 "Multiple"을 출력하고, 가능한 조합이 없다면 "Impossible"를 출력한다.
▶입력
첫번째 줄에 X를 A진법으로 표현한 값과 X를 B진법으로 표현한 값이 공백으로 구분되어 주어진다. 각 자리수는 0 이상 z 이하이다. a부터 z 는 10부터 35 를 의미한다.
단, 0을 제외한 각 수는 0 으로 시작하지 않으며, 길이는 최대 70 이다
▶출력
만약 문제의 조건에 맞는 X, A, B가 유일하게 존재한다면, X를 십진법으로 표현한 수와 A와 B를 공백으로 나누어 출력하라. 만약 만족하는 경우가 2가지 이상이라면 "Multiple"을, 없다면 "Impossible"을 출력하라.
▶해설
1~36 진법이 존재 하므로 arr[] 배열을 이용해서 숫자들과 알파벳의 값들을 저장합니다.
i, j를 1~36 반복문 돌립니다. find() 함수를 이용하여 입력 받은 두 값과 i, j를 매칭 시켰을 때 같은 값이라면 만족하는 X가 있는 것이므로 값들을 저장하고 count를 증가시킵니다. count>=2(Multiple) count==1(X A B) count==(Impossible)이 해당됩니다.
이때 체크해야할 부분은 만약 진법보다 입력 받은 값이 큰 경우입니다.
ex) 입력 받은 값: ep jh
입력 받은 값중에서 가장 큰 값은 p입니다. 이때 p가 뜻하는 진법은 26진법이므로 26보다 작은 i, j가 들어온다면 모두 continue해서 find()를 실행하지 않습니다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { static String xA,xB,x,max; static long a,b; static int count; static int [] arr; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] s = br.readLine().split(" "); xA=s[0]; xB=s[1]; max = String.valueOf(Math.pow(2, 63)); arr= new int[200]; for(int i=0; i<9; i++){ arr[i+'1']=i+1; } for(int i=0; i<26; i++){ arr['a'+i]=i+10; } solve(); if(count==0){ System.out.println("Impossible"); } else if(count==1){ String toInteger = x.substring(0, x.length() - 2); System.out.println(toInteger+" "+a+" "+b); } else{ System.out.println("Multiple"); } } public static void solve(){ for(int i=1; i<=36; i++){ for(int j=1; j<=36; j++){ if(i==j){ continue; } if(check(i,xA) && check(j,xB)){ if(find(i,xA).equals(find(j,xB))){ if(find(i,xA).compareTo(max)>=1){ continue; } count++; x=find(i,xA); a=i; b=j; } } } } } public static String find(int a, String s){ int temp=0; double result=0; StringBuilder sb = new StringBuilder(); for(int i=s.length()-1; i>=0; i--){ int t = arr[s.charAt(i)]; result += Math.pow(a, temp) * t; temp++; } return String.valueOf(result); } public static boolean check(int a, String s){ for(int i=0; i<s.length(); i++){ if(a<=arr[s.charAt(i)]){ return false; } } return true; } } //2*14, 4*16

'Alogorithm' 카테고리의 다른 글
백준 20440[자바] java 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1 (0) | 2022.02.10 |
---|---|
백준 1477 [자바] java 휴게소 세우기 (0) | 2022.02.07 |
백준 2015 [자바] java 수들의 합4 (0) | 2022.01.20 |
백준 JAVA 9613 GCD 합 (0) | 2021.12.31 |
백준 JAVA 2407번 조합 (0) | 2021.12.30 |
댓글
이 글 공유하기
다른 글
-
백준 20440[자바] java 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1
백준 20440[자바] java 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1
2022.02.10 -
백준 1477 [자바] java 휴게소 세우기
백준 1477 [자바] java 휴게소 세우기
2022.02.07 -
백준 2015 [자바] java 수들의 합4
백준 2015 [자바] java 수들의 합4
2022.01.20 -
백준 JAVA 9613 GCD 합
백준 JAVA 9613 GCD 합
2021.12.31
댓글을 사용할 수 없습니다.