코딩테스트-알고리즘/백준 BOJ

[백준 BOJ/Silver I] 금민수의 개수

닉네임생각즁 2024. 1. 9. 21:00

 

 

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

 

1527번: 금민수의 개수

첫째 줄에 A와 B가 주어진다. A는 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. B는 A보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int count = 0;
        Scanner sc = new Scanner(System.in);
        int A = sc.nextInt();
        int B = sc.nextInt();

        for(int i = A; i <= B; i++) {
            int n = i;
            while (n > 0) {
                if (n % 10 == 4 || n % 10 == 7) {
                    n = n / 10;
                    if (n == 0) count++;
                    else continue;
                } else break;
            }
        }
        System.out.println(count);

    }

}

 

 

처음에는 평소에 하던거처럼 String으로 변환 후 문자열 길이만큼 돌면서 charAt을 써서 각 자리가 4 or 7인지 확인하였다 예제 몇개를 넣어 확인해봤을때는 정답이 나와서 제출했더니 메모리 초과가 나왔다

		for(int i = A; i <= B; i++) {
			String str = Integer.toString(i);
			for(int j=0; j<str.length(); j++) {
				if(str.charAt(j) == '4' || str.charAt(j) == '7') {
					if(j == str.length()-1) count++;
					else continue;
				} else break;
			}
		}

 

 

A는 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. B는 A보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다.

-> 조건을 보니 수가 엄청 커지는 경우가 있을거고 이럴때 문자열로 변환하고 하나하나 비교해주는 과정이 부담되니 메모리 초과가 나오는거같았다

 

그래서 여러가지 생각해보던 중 숫자를 10으로 나눠서 나머지를 확인하고 나머지가 4 또는 7이 맞으면(=수의 끝자리가 4 또는 7) 10으로 나눈 몫을 다음 값으로 주는 식으로 반복하니 해결이 되었다!!!