달달한 스토리

728x90
반응형

 

역시나 전 문제도 문제풀이를 볼 수밖에 없었던 너무나도 어려운 문제였다ㅠㅠ

 

그래도 이번 문제는 직접 풀어 기분 좋아 글을 써본다.

 

물론 효율적인 방법은 아닌 것 같다.

 

다른 분이 써놓은 코드랑 비교하니 내가 너무 비효율적이었던 것이다.

 

우선은 기록이니 글을 쓰고,

 

답과 한번 더 비교해보며 공부해봐야겠다.

 

1978

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Test1978 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int cnt = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int sosu = 0;
        for(int i = 0; i < cnt; i++) {
            int value = Integer.parseInt(st.nextToken());
            
            if(!((value / 2 > 1 && value % 2 == 0)
                    || (value / 3 > 1 && value % 3 == 0)
                    || (value / 5 > 1 && value % 5 == 0)
                    || (value / 7 > 1 && value % 7 == 0)
                    || (value / 11 > 1 && value % 11 == 0)
                    || (value / 13 > 1 && value % 13 == 0)
                    || (value / 17 > 1 && value % 17 == 0)
                    || (value / 19 > 1 && value % 19 == 0)
                    || (value / 21 > 1 && value % 21 == 0)
                    || (value / 23 > 1 && value % 23 == 0)
                    || (value / 27 > 1 && value % 27 == 0)
                    || (value / 29 > 1 && value % 29 == 0)
                    || value == 1))
                sosu++;
        }

        System.out.print(sosu);
    }
}

 

주어지는 수의 최대 수는 1000개이다.

 

소수중에 제곱했을때, 최대 값이 1000을 넘기지 않는 범위 내에서 소수의 개수를 얻을 수 있었다.

 

다음 문제에서 좀 더 코드를 간결하게 줄여 보았다.

 

2581

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Test2581 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int min = Integer.parseInt(br.readLine());
        int max = Integer.parseInt(br.readLine());

        ArrayList<Integer> arr = new ArrayList<>();

        for (int i = min; i <= max; i++) {
            if (isSosu(i))
                arr.add(i);
        }

        if (arr.size() == 0) {
            System.out.println(-1);
        } else {
            System.out.println(arr.stream().mapToInt(Integer::intValue).sum());
            System.out.println(Collections.min(arr));
        }
    }

    //이 값이 소수인지 아닌지 체크
    private static boolean isSosu(int value) {

        if (value == 1) return false;

        //제곱을 했을때, 자연수 만을 넘기기 전까지의 소수들
        int[] arr = new int[]{
                2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
                49, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97
        };

        for (int j : arr) {
            if (!(value / j <= 1 || value % j != 0)) {
                //나눠지는게 하나라도 나오면 소수가 아님
                return false;
            }
        }
        //나눠지는게 하나도 안나온다면 소수
        return true;
    }
}

 

이번에도 10000을 넘기지 않는 제곱의 수를 배열에 넣어주고,

 

그 안에 해당하지 않는 값에 따라 소수인지 아닌지 판별하게 했다.

 

오늘 술약속이 있어서.. 여기까지 하고 이만..

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading