Hayden's Archive

[알고리즘] 백준 - 진법 변환 관련 문제 본문

Algorithm

[알고리즘] 백준 - 진법 변환 관련 문제

_hayden 2020. 7. 14. 01:31

백준 11005번 : 진법 변환 2

알고리즘 문제 출처 : https://www.acmicpc.net/problem/11005

 

11005번: 진법 변환 2

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 ��

www.acmicpc.net


내가 작성한 코드

10진법 수 N을 B진법으로 바꾸려면 N이 0이 될 때까지 나머지를 계속해서 구하면 된다.

import java.util.Scanner;

public class Main {
	
	public static StringBuilder change(int n, int b) {
		StringBuilder sb = new StringBuilder();
		while(n>0) {
			if(n%b < 10) {
				sb.append(n%b);
			}else {
				sb.append((char)(n%b+55));
			}
			n /= b;
		}
		return sb.reverse();
	}
	
    public static void main(String args[]) {
    	Scanner sc = new Scanner(System.in);
    	int n = sc.nextInt();
    	int b = sc.nextInt();
    	StringBuilder sb = change(n, b);
    	System.out.println(sb);
	}
}

 

 


백준 2745번 : 진법 변환

알고리즘 문제 출처 : https://www.acmicpc.net/problem/2745

 

2745번: 진법 변환

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 

www.acmicpc.net

 

내가 작성한 코드

import java.util.Scanner;

public class Main {
	
    public static void main(String args[]) {
    	Scanner sc = new Scanner(System.in);
    	String numStr = sc.next();
    	int b = sc.nextInt();
    	long answer = 0;
    	for(int i=0; i<numStr.length(); i++) {
    		int num = 0;
    		if(Character.isAlphabetic(numStr.charAt(i))) {
    			num=(int)numStr.charAt(i)-55;
    		}else {
    			num = Integer.parseInt(numStr.substring(i,i+1));
    		}
    		answer += num * Math.pow(b, numStr.length()-1-i);
    	}
    	System.out.println(answer);
	}
}

 

 


백준 11576번 : Base Conversion

알고리즘 문제 출처 : https://www.acmicpc.net/problem/11576

 

11576번: Base Conversion

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

www.acmicpc.net

 

내가 작성한 코드

import java.util.Scanner;
import java.util.Stack;

public class Main {
	
    public static void main(String args[]) {
    	Scanner sc = new Scanner(System.in);
    	Stack<Long> stack = new Stack<>();
    	int a = sc.nextInt();
    	int b = sc.nextInt();
    	int m = sc.nextInt();
    	long ten = 0;
    	for(int i=m-1; i>=0; i--) {//A진법을 10진법으로 변환
    		int num = sc.nextInt();
    		ten += num * Math.pow(a, i);
    	}
    	while(ten!=0) {//10진법으로 B진법으로 변환
    		stack.push(ten%b);
    		ten/=b;
    	}
    	while(!stack.isEmpty()) {
    		System.out.print(stack.pop()+" ");
    	}
    }
}

 

 


백준 1373번 : 2진수 8진수

알고리즘 문제 출처 : https://www.acmicpc.net/problem/1373

 

1373번: 2진수 8진수

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

www.acmicpc.net

 

내가 작성한 코드

주어진 수의 길이가 매우 길어서 숫자로 담아낼 수 없다는 점을 고려해야 한다. 2진수를 뒷자리부터 세 덩어리씩 자르면 8진수로 바꿀 수 있다. 예컨대 11001100은 11/001/100으로 나눌 수 있으며 2+1/1/4로 8진수로 314가 된다. 

주어진 수의 길이가 3으로 나누어떨어지는 경우에는 바로 반복문을 실행하면 되지만, 나머지가 1이거나 2인 경우에는 별도로 처리해줘야 한다. 특히 주어진 수의 길이가 1인데 그 수가 0인 경우 0이 출력되도록 해야 한다.

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
    	Scanner sc = new Scanner(System.in);
    	char[] input = sc.nextLine().toCharArray();
    	int start = 0;
    	int temp = 0;
    	if(input.length%3==1) {
    		if(input[0]=='1') {
    			System.out.print(1);
    		}else if(input.length==1) {
    			System.out.println(0);
    		}
    		start = 1;
    	}
    	else if(input.length%3==2) {
    		if(input[0]=='1') {
    			temp = 2;
    		}
    		if(input[1]=='1'){
    			temp += 1;
    		}
    		System.out.print(temp);
    		start = 2;
    	}
    	for(int i=start; i<=input.length-3; i+=3) {
    		temp = 0;
    		if(input[i]=='1') {
    			temp += 4;
    		}
    		if(input[i+1]=='1') {
    			temp += 2;
    		}
    		if(input[i+2]=='1') {
    			temp += 1;
    		}
    		System.out.print(temp);
    	}
	}
}

 

char형과 int형의 연산 참고

 

 


백준 1212번 : 8진수 2진수

알고리즘 문제 출처 : https://www.acmicpc.net/problem/1212

 

1212번: 8진수 2진수

첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.

www.acmicpc.net

 

내가 작성한 코드

위의 문제와 반대로 풀면 된다. 먼저 0~7에 해당하는 2진수 값을 배열 binary에 저장해뒀다. 입력된 8진수의 앞자리에서 해당되는 숫자를 만날 때마다 해당 2진수 값을 찾아오는데 가장 앞에 온 수는 그대로 인쇄하되, 그 다음에 온 수는 한자리이거나 두 자리일 경우 앞에 00이나 0을 붙여줘야 한다.

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
    	Scanner sc = new Scanner(System.in);
    	String[] input = sc.nextLine().split("");
    	int[] binary = {0, 1, 10, 11, 100, 101, 110, 111};
    	for(int i=0; i<input.length; i++) {
    		int num = Integer.parseInt(input[i]);
    		if(i==0) {
    			System.out.print(binary[num]);
    		}else if(num<2) {
    			System.out.print("00"+binary[num]);
    		}else if(num<4) {
    			System.out.print("0"+binary[num]);
    		}else {
    			System.out.print(binary[num]);
    		}
    	}
	}
}