[백준]2745 - 진법 변환 / Math.pow(진법,승),break;

goyoung·2024년 1월 8일
0

[백준]코딩테스트

목록 보기
4/6

| 문제 풀이에 앞서..
코딩테스트 학습 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부에서 호출하는 방식으로 사용해서 기재해두었다.


| 느낀점

  • break;를 사용할 땐, loop문이나 switch가 있을 경우에 사용할 수 있음을 잊지말 것!
  • Math.pow(진법,승)으로 구성된다. Math.pow()는 type이 double 타입이며, int 형으로 값을 출력할 경우에는 int 변수=Math.pow(a,b)자동으로 형변환이 된다. 그런데 이렇게 사용할 경우 가끔 값이 누실될 수도 있다고 하니 해당 부분에 대한 내용은 추후 또 포스팅 해놓기!
  • 값을 누적할 땐 초기값이 있어야함을 잊지말기!

0개의 댓글