백준
백준 닷컴 단계 별로 풀어보기 12단계
CD가참둥그렇다
2023. 10. 8. 20:33
1단계 블랙잭
- 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.
- N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.
import java.util.Scanner;
public class Step_1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
int[] arr = new int[n];
for (int i=0; i<n; i++) {
arr[i]=scan.nextInt();
}
int close =0;
for (int i=0; i<n-2; i++) {
for (int j=i+1; j<n-1; j++) {
for (int k= j+1; k<n; k++) {
int sum = arr[i] + arr[j] + arr[k];
if (m-close>m-sum&&m-sum>=0) {
close = sum;
}
}
}
}
System.out.println(close);
}
}
A.
- 각 카드의 정보를 int 배열에 담아준다.
- 가장 가까운 수를 받아줄 close를 0으로 초기화 한다.
- 중복되지 않는 세 수를 뽑아서 모두 비교하는 3중 반복문을 작성한다.
- 내부에 카드 3 장의 합을 구하고, m-close와 m-sum을 비교하여 m-sum이 더 작으면 서 m-sum이 0 이상인 경우 close를 sum으로 교체하는 식을 작성한다.
- close를 출력한다.
2단계 분해합
- 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
- 자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.
- 첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.
import java.util.Scanner;
public class Step_1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String str = ""+n;
int length=str.length();
for (int i=(n-length*10); i<n; i++) {
String strI = i+"";
int temp=i;
int sum = i;
for (int j=0; j<strI.length(); j++) {
sum += temp%10;
temp/=10;
}
if (sum == n) {
System.out.println(i);
break;
}
if (i==(n-1)) {
System.out.println(0);
}
}
}
}
A.
- 분해 합은 원래의 숫자보다 자리수*10보다 크게 나올 수 없다.
- 따라서 분해 합 - 분해 합의 자리수x10부터 차례대로 분해 합을 구하여 원래의 분해 합 까지의 결과를 보고 해당하는 값이 없다면 분해 합이 없는 경우라고 생각할 수 있다.
- int로 받은 숫자를 문자열로 바꿔 길이를 측정하여 자리 수를 따진다.
- 반복문을 작성하여 n-length*10부터 n까지의 반복문을 작성한다.
- 각 반복에 대해 i값에 각 자리 수를 더한 결과가 n과 같은지 확인하는 반복문을 작성한다.
- 결과가 같다면 i값을 출력하고 반복문을 멈춘다(가장 작은 값에서 멈추게 된다.)
- i가 n-1까지 반복된 경우 0을 출력하도록 한다.
3단계 수학은 비대면강의입니다

- 정수 a,b,c,d,e,f,가 주어지고 연립방정식을 만족하는 x, y는 유일하며, 정수로 나온다.
- x, y를 출력한다.
import java.util.Scanner;
public class Step_3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
int c = scan.nextInt();
int d = scan.nextInt();
int e = scan.nextInt();
int f = scan.nextInt();
int x, y;
if (a==0) {
y= c/b;
x = (f-e*y)/d;
} else if (d == 0) {
y = f/e;
x = (c-b*y)/a;
} else {
y = (c*d-f*a)/(b*d-a*e);
x = (c - b*y)/a;
}
System.out.println(x +" "+y);
}
}
A.
- 연립방정식의 해에 대한 식을 세워서 푼다.
- 결과가 정수로 나오게 되므로 int를 사용하여 푼다.
- a가 0일 경우와 b가 0일 경우는 연립방정식이 되지 않기 때문에 분리하여 계산한다.
- 나머지 경우 유일한 해가 있는 경우 by zero 오류에 걸리지 않기 때문에 일반적인 해의 공식을 사용한다.
4단계 체스판 다시 칠하기
- 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.
- 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
- 첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.
import java.util.Scanner;
public class Step_3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
scan.nextLine();
String[][] strArr = new String[n][];
for (int i=0; i<n; i++) {
String temp = scan.nextLine();
strArr[i]=temp.split("");
}
int count = chess(strArr, 0, 0);
for (int i=0; i<n-7; i++) {
for (int j=0; j<m-7; j++) {
if (chess(strArr, i,j)<count) {
count = chess(strArr,i,j);
}
}
}
System.out.println(count);
}
public static int chess(String[][] strArrArr, int a, int b) {
int count = 0;
for (int i=a; i<a+8; i++) {
for (int j=b; j<b+8; j++) {
if ((i+j)%2==0) {
if(strArrArr[i][j].equals("B")) {
count++;
}
} else {
if(strArrArr[i][j].equals("W")) {
count++;
}
}
}
}
if (64-count<count) {
count = 64-count;
}
return count;
}
}
A.
- int 2개를 받아서 저장한다.
- 문자열 2차원 배열을 선언하고 초기화한다.
- 반복문을 만들고 각 배열에 다음 줄의 문자열을 “”기준으로 분리한 문자열 배열을 저장한다.
- 메소드 chess를 작성하고 2차원 배열과 int값 2개를 받아서 int로 출력하도록 작성한다.
- chess 내부에 a~a+8 / b~b+8 범위를 체크해 i+j가 홀수 짝수일 경우로 나누어 b/w를 검사하고 일치할 경우 count가 올라가는 반복문을 작성한다.
- count가 64-count보다 큰 경우 64-count를 저장하도록 하고 count를 반환하도록 한다.
- 메인에 반복문을 작성하여 0~n-7/0~m-7까지의 반복을 하는 반복문을 만들고, 각각 chess(strArr, i,j)를 검사 하여 가장 작은 count 값을 저장하도록 한다.
- 가장 작은 값을 출력한다.
5단계 ****영화감독 숌
- 종말의 수란 어떤 수에 6이 적어도 3개 이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 수는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 이다. 따라서, 숌은 첫 번째 영화의 제목은 "세상의 종말 666", 두 번째 영화의 제목은 "세상의 종말 1666"와 같이 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 수) 와 같다.
- 숌이 만든 N번째 영화의 제목에 들어간 수를 출력하는 프로그램을 작성하시오. 숌은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.
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 count = 0;
int i = 0;
while (count < n) {
String str = ++i + "";
if (str.contains("666")) {
count++;
}
}
System.out.println(i);
}
}
A.
- 넘버링을 셀 int count를 0으로 초기화 한다.
- 반복문을 만들고 count가 n보다 작을 때 반복하도록 한다.
- int i를 0부터 시작하도록 하고 반복마다 1씩 증가시키도록 한다.
- i를 문자열로 변환 후 666이라는 문자열을 포함할 경우 count를 1 늘리도록 한다.
- count가 n과 같아지는 i를 출력한다.
6단계 ****설탕 배달
- 상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
- 상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
- 상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.
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 five = n / 5;
int rest = n % 5;
int three = 0;
while (rest != 0) {
if (rest >= 3) {
three++;
rest -= 3;
} else {
five--;
three++;
rest += 2;
}
}
if (five<0||three<0) {
System.out.println(-1);
} else {
System.out.println(five + three);
}
}
}
A.
- int 변수 five, rest, three, count를 선언한다. five는 5키로 봉지 개수, three는 3키로 봉지 개수, rest는 남은 설탕을 나타낸다.
- five에 최대한 담도록 n값을 5로 나누어 저장한다. 5로 나눈 나머지를 rest에 저장한다.
- while문을 만들고 조건으로 나머지가 0이 아닐 것으로 한다.
- 나머지가 3 이상인 경우 3키로 수를 1개 늘리고 나머지를 3 줄이도록 한다.
- 나머지가 3 미만인 경우 5키로 수를 1개 줄이고 3키로를 1개 늘린다. 나머지는 2를 늘린다.
- 나머지가 0이 되는 경우는 반드시 생기지만 봉지의 개수가 음수일 수 없기 때문에 봉지의 개수가 음수인 경우는 -1을 출력하고, 나머지 경우 두 봉지의 합을 출력하도록 한다.