Hayden's Archive
[알고리즘] 백준 - 진법 변환 관련 문제 본문
백준 11005번 : 진법 변환 2
알고리즘 문제 출처 : https://www.acmicpc.net/problem/11005
내가 작성한 코드
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
내가 작성한 코드
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
내가 작성한 코드
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
내가 작성한 코드
주어진 수의 길이가 매우 길어서 숫자로 담아낼 수 없다는 점을 고려해야 한다. 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
내가 작성한 코드
위의 문제와 반대로 풀면 된다. 먼저 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]);
}
}
}
}