Baekjoon Online Judge
문제
은민이는 4와 7을 좋아하고, 나머지 숫자는 싫어한다. 금민수는 어떤 수가 4와 7로만 이루어진 수를 말한다.
N이 주어졌을 때, N보다 작거나 같은 금민수 중 가장 큰 것을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. N은 4보다 크거나 같고 1,000,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 N보다 작거나 같은 금민수 중 가장 큰 것을 출력한다.
예제 입력 | 예제 출력 |
100 | 77 |
75 | 74 |
5 | 4 |
474747 | 474747 |
풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String N = in.next(); // 입력
int idx = N.length() - 1; // 숫자의 길이
int result = 0; // 결과
// N보다 작거나 같은 금민수 중 가장 큰 것 찾기
for (int i = 0; i <= idx; i++) {
int num1 = 7;
int num2 = 4;
for (int j = i; j < idx; j++) {
num1 *= 10;
num2 *= 10;
}
result += num1;
// 현재 구하고 있는 자릿수에 4를 넣을지 7을 넣을 지 결정한다.
if (result > Integer.parseInt(N)) {
result -= num1 - num2;
// 해당 자리에 4를 넣어도 N보다 큰 수가 만들어질 때
if (result > Integer.parseInt(N)) {
result -= num2;
if (i != 0) {
result += num1;
if (result / (num1 * 10 / 7) == 4)
result %= (num1 * 10 / 7);
else
result -= (num1 - num2) * 10;
}
}
}
}
// 출력
System.out.println(result);
}
}
입력 받은 숫자의 길이를 쉽게 구할 수 있도록 string으로 값을 받았다. 입력 받은 숫자의 가장 큰 자릿수부터 차근차근 비교하면서 가장 큰 금민수를 찾았다.
int num1 = 7;
int num2 = 4;
for (int j = i; j < idx; j++) {
num1 *= 10;
num2 *= 10;
}
for문 안의 이 코드는 현재 비교하면서 7이나 4 중 어떤 숫자를 넣어야할지 고민하는 자릿수까지 7과 4의 위치를 옮겨준다.
ex) 100의 자리일 경우 : num1 = 700, num2 = 400
그 뒤 result에 num1을 더한 뒤 result가 입력받은 숫자 N보다 큰지 확인해본다. 만약 result가 N보다 크다면 해당 자리의 숫자를 7에서 4로 바꿔본다. 4로 바꿔도 result가 N보다 크다면 아래의 코드가 작동한다.
// 해당 자리에 4를 넣어도 N보다 큰 수가 만들어질 때
if (result > Integer.parseInt(N)) {
result -= num2;
if (i != 0) {
result += num1;
if (result / (num1 * 10 / 7) == 4)
result %= (num1 * 10 / 7);
else
result -= (num1 - num2) * 10;
}
}
만약 지금 숫자를 정하는 자리가 가장 큰 자릿수라면 해당 자리를 0으로 둔다.
가장 큰 자릿수가 아니라면 아래의 예시처럼 지금 자리보다 더 큰 자릿수의 수를 바꾸게 된다.
ex1)
N = 700
1. i = 0, result = 700
2. i = 1, result = 770 -> result = 740 -> result = 470
3. i = 2, result = 477
ex2)
N = 41
1. i = 0, result = 70 -> result = 40
2. i = 1, result = 47 -> result = 44 -> result = 7
그 뒤 위의 과정을 통해 얻은 result를 출력했다.
'백준 > JAVA' 카테고리의 다른 글
[Baekjoon/JAVA] 1598번 - 꼬리를 무는 숫자 나열 (0) | 2022.07.30 |
---|---|
[Baekjoon/JAVA] 1592번 - 영식이와 친구들 (0) | 2022.07.30 |
[Baekjoon/JAVA] 1568번 - 새 (0) | 2022.07.19 |
[Baekjoon/JAVA] 1524번 - 세준세비 (0) | 2022.06.05 |
[Baekjoon/JAVA] 1408번 - 24 (0) | 2022.05.30 |