| 문제 풀이에 앞서..
코딩테스트 학습 2일차인 나에겐 너무나도 어렵게 느껴졌던 문제다..ㅠ_ㅠ 그래도 결국 풀었지만,, 앞으로 공부 열심히 해야겠다고 느끼게 해준 문제였다.
| 문제
B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35
| 입력
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)
B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.
| 출력
첫째 줄에 B진법 수 N을 10진법으로 출력한다.
| 예제 입력
ZZZZZ 36
| 예제 출력
60466175
//방법 1
package Study;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class A2745_study {
//진법변환
//12345=(1*10000)+(2*1000)+(3*100)+(4*10)+(5*1)
// =(1*10^4)+(2*10^3)+(3*10^2)+(4*10^1)+(5*10^0)
public static void main(String[] args) {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
int result=0; //초기값이 없는 상태에선 값을 누적할 수 없다.
try {
StringTokenizer st=new StringTokenizer(bf.readLine());
String N=st.nextToken(); // 주어진 수 N
int B=Integer.parseInt(st.nextToken()); //주어진 진법
//'0'=48, '1'=49, '2'=50...
//'a'=97, 'b'=98, 'c'=99...
//'A'=65, 'B'=66, 'C'=67...
//입력 N = ZZZZZ
for(int i=0;i<N.length();i++) { //for문을 승으로 쓸거임
char ch=N.charAt(N.length()-i-1); //i가 0부터면 맨 마지막 N이 0승이어야 하므로
//ch가 문자인지 숫자인지 비교 -> 10진법(1~9)까지는 숫자이고
// A부터 10,11,12라고 했으니 보정값 +10해줌
// 참(정수값)이면 앞에값 출력:거짓(문자)이면 뒤에값 출력
int check_ch=Character.isDigit(ch)?(ch-'0'):(ch-'A'+10);
result+=check_ch*Math.pow(B,i);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(result);
}
}
//방법2
package BaekJoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class A2745 {
public static void main(String [] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
//bf.readLine()은 한 줄을 읽어온다
//StringTokenizer st=new StringTokenizer(bf.readLine());는 공백이나 다른 구분자 기준으로 두부분으로 나누어 읽어올 수 있음
//한줄에 쓰고 읽을 땐 st.nextToken()
StringTokenizer st=new StringTokenizer(bf.readLine());
String N=st.nextToken();
int B=Integer.parseInt(st.nextToken());
int a=Change_N(N, B);
System.out.println(a);
}
//static을 붙여 정적메서드로 만들어준다. -> 객체 인스턴스에 의존하지 않게 하기 위해
//그냥 public int 형태의 메서드로 만들면 인스턴스의 메서드가 되기 때문에 -> 클래스의 객체를 생성해야 메서드를 호출할 수 있게됨
//정적메서드를 사용하면 클래스의 객체를 생성하지 않고도 메서드를 직접 호출할 수 있다.
public static int Change_N(String N,int B) {
int ch_N=0;
//ABCDE면 5번 돌림 ZZZZZ 36
//처음 : 5-0-1 = 4번째 index값 e / 두번째 : 5-1-1=3번째 index 값 d ...
for(int i=0; i<N.length(); i++) {
//예를들어, N이 '12345'라면 '5'의 10진수 53으로 ch에 저장
char ch=N.charAt(N.length()-i-1); // 이 상태에서만 출력하면 마지막값인 a의 10진법이 나옴
//isDigit() : Character클래스의 메서드 ->()안의 값이 숫자인지 문자인지 판단
//()값이 숫자라면 true를 반환, 문자라면 false를 반환
//10진법에서는 '0'~'9'까지의 문자를 나타내기 위해 0부터 9까지의 숫자를 사용
//그러나 해당문제에서는 알파벳 문자를 10진법으로 나타내기 위해 'A'부터 'Z'까지를 10~35까지 숫자로 표현
// '0'=48,'1'=49,'2'=50... -> 문자'N'에 대한 아스키 코드
// 'A'=65, 'B'=66, 'C'=67...
int value=Character.isDigit(ch)?(ch-'0'):(ch-'A'+10); //보정값 +10
//Math.pow(진법,승)
//ex)6491=6000+400+90+1 -> 형준오빠가 올려준 블로그 참고
// (6*1000)+(4*100)+(9*10)+(1*1)
// (6*10^3)+(4*10^2)+(9*10^1)+(1*10^0)
ch_N+=value*Math.pow(B, i);
}
return ch_N;
}
}
=> 사실 방법1과 방법2가 같으나, 방법2의 경우는 static 메서드를 생성해 main부에서 호출하는 방식으로 사용해서 기재해두었다.
| 느낀점