Nellie's Blog

[항해99 10기] 알고리즘 모의고사 - 3번. 소수의 개수와 덧셈 본문

회고록/항해99

[항해99 10기] 알고리즘 모의고사 - 3번. 소수의 개수와 덧셈

Nellie Kim 2022. 11. 24. 12:25
728x90

3번. 소수의 개수와 덧셈 (상)

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.

예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.

 

제한사항

  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
  • 문자열에는 소수가 한개 이상 섞여 있습니다.
  • 문자열에는 소수가 아닌 수가 한개 이상 섞여 있습니다.
  • 음수는 없습니다.

답안포맷

public class Main {
    public String solution(String s) {
        String answer = "";
        return answer;
    }

    public static void main(String[] args) {
        Main method = new Main();
        String s = "97 75 88 99 95 92 73";
        System.out.println(method.solution(s));
    }
}

 

 

 

- 내 풀이

public class Main0 {
    public static String solution(String s) {
        String answer = "";
        List<Integer> primes = new ArrayList<>(); //소수 - 최댓값 97
        List<Integer> notPrimes = new ArrayList<>(); // 소수아님  -최솟값 75
        List<Integer> temp = new ArrayList<>();

        String[] str = s.split(" "); //문자열을 리스트로 (str -> temp)
        for (String s1 : str) {
            int i = Integer.parseInt(s1);
            temp.add(i);
        }

        for (int i = 0; i < temp.size(); i++) { //temp리스트를 반복문으로 돌리기 97 75 88 99 95 92 73
            for (int j = 2; j < temp.get(i); j++) {
                if (temp.get(i) % j == 0) { //소수가 아닌경우 -- 75, 88, 99, 95, 92
                    notPrimes.add(i);
                    break;
                }
            }
               // <-  여기에 어떻게 넣어야 하지???,,,,
        }
        Collections.sort(primes, Collections.reverseOrder()); //내림차순
        Collections.sort(notPrimes);  // 오름차순

        int ans1 = primes.get(0);
        int ans2 = notPrimes.get(0);

        return ans2 + " " + ans1;
    }
    public static void main(String[] args) {
        String s = "97 75 88 99 95 92 73";
        System.out.println(solution(s));
    }
}

 

다른 풀이 1

public class Main2 {
    public static String solution(String s) {
        String answer = "";
        List<Integer> temp = new ArrayList<>();
        ArrayList<Integer> primes = new ArrayList<>();
        ArrayList<Integer> notPrimes = new ArrayList<>();

        /******** String → Integer ********/
        String[] str = s.split(" ");
        for (String s1 : str) {
            int i = Integer.parseInt(s1);
            temp.add(i);
        }
        /**********************************/
        // 소수 판별
        for(int i : temp) { //temp리스트를 반복문으로 돌리기
            if(isPrime(i)) {
                primes.add(i);
            } else {
                notPrimes.add(i);
            }
        }
        Collections.sort(primes, Collections.reverseOrder());
        Collections.sort(notPrimes);

        int ans1 = primes.get(0);
        int ans2 = notPrimes.get(0);

        return ans2 + " " + ans1;
    }
    public static boolean isPrime(int num){
        if(num == 1) {
            return false;
        }
        for(int i = 2; i < num; i++){
            if(num % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        String str = "97 75 88 99 95 92 73";
        System.out.println(solution(str));
    }
}

 

다른 풀이 2

package org.example;

public class Main1 {
    public static String solution(String s){
        String[] box = s.split(" "); // 문자열을 배열로 쪼개서 box배열에 넣기 97 75 88 99 95 92 73
        long max = -1; // 소수 아닌 수의 최소값
        long min = -1; // 소수의 최대값
        for(String numStr : box){ //String타입배열 box의 요소를 하나씩 빼서 numStr에 넣기
            boolean isPrimeNum = true; //boolean타입의 isPrimeNum변수를 설정하고 true로 초기화
            long numV = Long.valueOf(numStr); //box에 있는 String배열을 Long타입인 numV로 전환!!
            int i = 2;

            //--------소수 판별 함수 (boolean값인 isPrimeNum 함수로 판별)-----------------------
            while(i <= Math.sqrt(numV)){ //numV의 제곱근으로 나누어 소수인지 판별
                if(numV % i == 0){ //제곱근을 '2~ 제곱근까지'로 나누었을 때 나누어 떨어지면 소수가 아니다.
                    isPrimeNum = false; // 소수가 아니니까 isPrimeNum 값을 false로 준다. (자동으로 나머지는 true가 됨)
                    break;
                }
                i++;
            }
            //-------- 소수아닌 수의 최소값(min) & 소수의 최대값(min) 바로 구하기--------------------
            if(!isPrimeNum){ // 소수가 아니라면 min 값을 구해주기
                if(min == -1 || numV < min){ // numV가 min보다 작으면, min값에 넣어주는 식으로 min구하기
                    min = numV;
                }
            }else{ // 소수가 맞다면 max 값을 구해주기
                if(max == -1 || numV > max){
                    max = numV;
                }
            }
        }
        String answer = String.valueOf(min) + " " + String.valueOf(max);
        return answer;
    }
    public static void main(String[] args) {
        String s = "2 3 4 5";
        System.out.println(solution(s));
        System.out.println(Math.sqrt(6));
    }
}

 

내가 다시 푼 풀이 

package org.example;
import java.util.*;

public class Main0 {
    public static String solution(String s) {
        String answer = "";
        List<Integer> primes = new ArrayList<>(); //소수 : 73, 97 - 최댓값 97
        List<Integer> notPrimes = new ArrayList<>(); // 소수아님 : 75, 88, 99, 95, 92 - 최솟값 75
        List<Integer> temp = new ArrayList<>();

        String[] str = s.split(" "); //문자열을 리스트로 (str -> temp)
        for (String s1 : str) {
            int i = Integer.parseInt(s1);
            temp.add(i);
        }
        for (int i = 0; i < temp.size(); i++) { //temp리스트를 반복문으로 돌리기 97 75 88 99 95 92 73
            int cnt = 0;
            for (int j = 2; j < temp.get(i); j++) {
                if (temp.get(i) % j == 0) { //소수가 아닌경우 -- 75, 88, 99, 95, 92
                    cnt++;
                }
            }
            if (cnt > 0) {
                notPrimes.add(temp.get(i));
            }else if(cnt == 0){
                primes.add(temp.get(i));
            }
        }
        Collections.sort(primes, Collections.reverseOrder()); //내림차순
        Collections.sort(notPrimes);  // 오름차순

        int ans1 = primes.get(0);
        int ans2 = notPrimes.get(0);

        return ans2 + " " + ans1;
    }
    public static void main(String[] args) {
        String s = "97 75 88 99 95 92 73";
        System.out.println(solution(s));
    }
}

이중 for문이 어려워서 그냥 cnt를 구해서 cnt가 0이면 소수라고 판단하는 로직을 짰다.....