백준
백준 닷컴 단계 별로 풀어보기 8단계
CD가참둥그렇다
2023. 10. 5. 22:46
1단계 진법 변환
- 첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)
- B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.
- 첫째 줄에 B진법 수 N을 10진법으로 출력한다.
import java.util.Scanner;
public class Step_1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.next();
int num = scan.nextInt();
int length =str.length();
char[] numbers = new char[length];
for (int i=0; i<length; i++) {
numbers[i]=str.charAt(i);
}
int[] numbers2 = new int[length];
for (int i=0; i<length; i++) {
if((numbers[i]+0)>=65&&(numbers[i]+0)<=90) {
numbers2[i]=numbers[i]-55;
} else {
numbers2[i] = numbers[i]-48;
}
}
int sum=0;
for (int i=0; i<length; i++) {
int a = (int)(Math.pow(num, length-i-1));
sum +=(numbers2[i]*a);
}
System.out.println(sum);
}
}
A.
- b진법 숫자를 문자열로 저장하고, 진법을 나타내는 int num을 저장한다.
- char배열에 b진법 숫자를 분리하여 대입힌다.
- int 배열을 만들고 b진법에 해당하는 숫자로 할당한다.
- b진법을 출력할 sum을 선언하고 0으로 초기화한다.
- 각 자리의 숫자와 진법에 해당하는 숫자를 곱한 값을 sum에 합해준다.
- n진법의 경우 뒤에서 m번째 숫자는 숫자 x n^m-1의 값이 된다.
- 제곱을 표현하기 위해 Math.pow를 이용한다. Math.pow는 double로 값을 반환한다.
2단계 진법 변환 2
- 첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.
- 첫째 줄에 10진법 수 N을 B진법으로 출력한다.
import java.util.Scanner;
public class Step_2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num1 = scan.nextInt();
int num2 = scan.nextInt();
String re = "";
int i = num1;
while (true) {
if (i % num2 == 0&& i/num2==0) {
break;
}
if (10 <= (i % num2) && (i % num2) <= 36) {
char char1 = (char) (i % num2 + 55);
re += char1;
} else {
re += (i % num2);
}
i = i / num2;
}
char[] arr = new char[re.length()];
for (int j=0; j<re.length(); j++) {
arr[j]=re.charAt(re.length()-j-1);
}
re="";
for (int j=0; j<arr.length; j++) {
re=re+arr[j];
}
System.out.println(re);
}
}
A.
- 두 수를 int에 받아준다.
- 임시 변수 i를 만들고 while문을 만든다.
- 임시 변수를 진법 b로 나눈 나머지를 해당 문자로 바꾸고 str에 그 값을 받아준다.
- 다음 자리 수를 나타내기 위해서 임시변수를 진법으로 나눈 몫으로 재설정 한다.
- 임시변수가 0이 될 때 까지 반복한다.
- str에 역순으로 된 b진법이 저장되었기 때문에 str을 반대로 바꿔주는 반복문을 만든다.
3단계 세탁소 사장 동혁
- 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 거스름돈 C를 나타내는 정수 하나로 이루어져 있다. C의 단위는 센트이다. (1달러 = 100센트) (1<=C<=500)
- 각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.
package stage08;
import java.util.Scanner;
public class Step_3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int test = scan.nextInt();
int[] arr = new int[test];
for (int i = 0; i < test; i++) {
arr[i] = scan.nextInt();
}
int quat = 0, dime = 0, nick = 0, penny = 0;
for (int i = 0; i < test; i++) {
int temp = arr[i];
quat = temp / 25;
temp %= 25;
dime = temp / 10;
temp %= 10;
nick = temp / 5;
temp %= 5;
penny = temp;
System.out.println(quat + " " + dime + " " + nick + " " + penny);
}
}
}
A.
- 테스트 수를 int에 받아준다.
- int 배열을 test만큼의 길이로 초기화한다.
- nextInt로 각 배열에 값을 저장한다.
- 쿼터, 다임, 니켈, 페니를 0으로 초기화해 저장한다.
- 반복문을 만들고 임시 변수 temp를 각 배열의 값으로 초기화한다.
- temp를 쿼터, 다임, 니켈, 페니로 나눈 몫을 저장하고, 각 시도마다 temp의 값을 나머지로 지정한다.
- 각 동전의 값을 출력하는 식을 만든다.
4단계 중앙 이동 알고리즘
- 외계 지형은 중앙 이동 알고리즘을 이용해서 만들려고 한다.
- 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 15)
- 첫째 줄에 과정을 N번 거친 후 점의 수를 출력한다.
import java.util.Scanner;
public class Step_4 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int test = scan.nextInt();
int dotNum = 2;
for (int i=0; i<test; i++) {
dotNum=dotNum*2-1;
}
System.out.println(dotNum*dotNum);
}
}
A.
- 각 상태에서 한 변의 점 개수는 기존 값의 2배-1개가 있다.
- 반복문을 통해 n번째 상태의 한 변의 점 개수를 구해주고, 제곱하여 출력한다.
5단계 벌집
- 벌집까지 최소거리를 구하기

import java.util.Scanner;
public class Step_5 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int hex = 1;
int step = 1;
while (n > hex) {
hex += 6*step;
step++;
}
System.out.println(step);
}
}
A.
- n에 입력 값을 저장한다.
- hex에 기준이 되는 육각형 개수, step에 거리를 지정하고 숫자를 1로 초기화한다.
- hex는 단계마다 6*step만큼 개수가 늘어나는 것을 이용한 반복문을 만든다.
- n이 hex보다 커지는 시점의 step을 출력한다.
6단계 분수 찾기
- 이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
- X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
package stage08;
import java.util.Scanner;
public class Step_6 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int div = 1;
int step = 1;
while (n > div) {
div += ++step;
}
int temp = div-n;
if(step%2==0) {
System.out.println((step-temp) + "/" + (temp+1));
} else {
System.out.println((temp+1) + "/" + (step-temp));
}
}
}
A.
- 지그재그가 일어나는 분수의 단위 개수가 1개 씩 늘어나는 것을 이용하여 div와 step을 반복문으로 지정한다.
- 지그재그가 step마다 방향이 바뀌는 것을 step의 홀짝을 이용해 제어한다.
- step에 따라 분자, 분모의 합이 정해지고, div와 step의 차이를 이용해 분자와 분모의 크기를 정한다.
7단계 달팽이는 올라가고 싶다
- 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
- 첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
- 첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
import java.util.Scanner;
public class Step_7 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
int v = scan.nextInt();
int h= v-a;
int d= h/(a-b)+1;
if (v==a) {
d=1;
} else if(h%(a-b)>0) {
d++;
}
System.out.println(d);
}
}
A.
- 반복문 작성 시 시간 초과 발생, 수학적 접근 필요
- 마지막 날 a만큼 올라갈 수 있는 점을 이용하여 새로운 높이 h를 v-a로 지정
- h를 며칠에 걸쳐 오르는지 체크. h를 a-b로 나누어 계산
- h/(a-b)가 나누어 떨어지면 하루가 덜 걸린다. 나머지 존재 유무를 이용하여 날짜를 조정한다.