본문 바로가기

백준/JAVA

[Baekjoon/JAVA] 1526번 - 가장 큰 금민수

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를 출력했다.