C++/백준

[C++] 백준) 1526번 가장 큰 금민수 문제풀이

S_Hoon 2020. 8. 24. 05:30

https://www.acmicpc.net/problem/1526

 

1526번: 가장 큰 금민수

첫째 줄에 N이 주어진다. N은 4보다 크거나 같고 1,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

문제

은민이는 4와 7을 좋아하고, 나머지 숫자는 싫어한다. 금민수는 어떤 수가 4와 7로만 이루어진 수를 말한다.

N이 주어졌을 때, N보다 작거나 같은 금민수 중 가장 큰 것을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. N은 4보다 크거나 같고 1,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 N보다 작거나 같은 금민수 중 가장 큰 것을 출력한다.

예제 입력 1 복사

100

예제 출력 1 복사

77


간단히 설명을 하자면

4, 7, 47, 77, 444, 447, 477 ....

이런식으로 

4와 7로만 이루어진 수를 구하는 것이지만

정수 N에서 밑으로 가장 가까운 4와 7로 이루어진 수를 구하는 문제이다.

 

예를 들어 500을 입력하면

477을 출력하면 되는 문제이다.


#include <iostream>

bool isGuemMinSu(int a) { // bool형으로 함수 생성
    bool result = true;   // 리턴할 bool형의 변수를 선언 후 true로 초기화
    while(a) { // a가 0이면 프로그램 종료
        if(!(a % 10 == 4 || a % 10 == 7)) { // a 나누기 10의 나머지가 4 혹은 7이 아닐 때
            result = false; 
            break; // while문을 종료한다
        }
        a /= 10; // a가 112라면 2를 없애고 11을 a에 넣어준다
    }
    return result; // if문에서 걸렸다면 false, 아니라면 true를 리턴
}
/* 
위에 함수를 더 설명드리자면
예를들어 a = 100이라면
100 % 10 = 0, 4 혹은 7 이 아니기 때문에 false를 리턴한다
아래 main함수에서 사용할 for문을 이용해 이 함수를 사용할 것이다
*/

int main() {
    int a;
    std::cin >> a;
    
    for(int i = a; i >= 1; i--) { // a가 100이라면 100이 1이 될 때까지 i를 1씩 빼면서 비교한다(최댓값을 구하기 위해)
        if(isNum(i)) { // isNum(i)가 true라면 i를 출력하고 for문을 종료
            std::cout << i << std::endl;
            break;
        }
    }
    return 0;
}

/*
100보다 작은 4 or 7로 이루어져있는 숫자는 77이다
main함수의 for문에서 100, 99, 98, 97, 96... 
이렇게 isNum함수에 대입하며 77이 됐을 때 true를 리턴하기 때문에
if문에 의해 i를 출력하고 for문을 종료할 수 있다
*/

#include <iostream>

bool isNum(int a) {
    bool result = true;
    while(a) {
        if(!(a % 10 == 4 || a % 10 == 7)) {
            result = false;
            break;
        }
        a /= 10;
    }
    return result;
}

int main() {
    int N;
    std::cin >> N;
    
    for(int i = N; i >= 1; i--) {
        if(isNum(i)) {
            std::cout << i << std::endl;
            break;
        }
    }
    return 0;
}