[알고리즘] 1016번

._mung·2024년 4월 9일
0

Algorithm

목록 보기
46/56

오늘 풀어볼 문제는 백준 1016번 문제 "제곱 ㄴㄴ 수" 이다.

이 문제는 골드1 문제이고 정수론 문제이다.

문제

어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 
제곱수는 정수의 제곱이다. min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수가 몇 개 있는지 출력한다.

입력

첫째 줄에 두 정수 min과 max가 주어진다.

출력

첫째 줄에 min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수의 개수를 출력한다.

📌첫 번째 도전📌
min과 max를 입력받아 범위 내에서 문제에서 요구하는 제곱수로 나누어 떨어지는 값을 true로 하고 마지막에 false의 갯수를 세어 출력하는 방식으로 풀었다.

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        long min = Long.parseLong(st.nextToken());
        long max = Long.parseLong(st.nextToken());

        boolean[] check = new boolean[(int) (max - min + 1)];

        for(long i=2; i*i<=max; i++) {
            long pow = i * i;
            long start_index = min / pow;
            if(min % pow != 0) {
                start_index++;
            }
            for(long j = start_index; pow * j <= max; j++) {
                check[(int) ((j*pow) - min)] = true;
            }
        }
        int count = 0;

        for(int i=0; i<=max-min; i++) {
            if(!check[i]) {
                count++;
            }
        }
        System.out.println(count);
    }
}

[문제 출처] : https://www.acmicpc.net/problem/1016

profile
💻 💻 💻

0개의 댓글

관련 채용 정보