코딩 테스트

[코딩테스트] 백준 2581번: 소수

dev.jelee 2025. 8. 2. 23:19

# 문제

주소: https://www.acmicpc.net/problem/2581


# 코드

v1

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

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

    int M = Integer.parseInt(br.readLine());
    int N = Integer.parseInt(br.readLine());
    
    ArrayList<Integer> nums = new ArrayList<>();
    
    // M ~ N 사이의 소수 구하기 계산
    for (int i = M; i <= N; i++) {
      ArrayList<Integer> other = new ArrayList<>();
      
      // M ~ N 사이의 나머지가 0인 자연수 구하기
      for (int j = 1; j <= i; j++) {
        int num = i % j;
        if (num == 0) {
          other.add(j);
        }
      }

      // 소수 구하기
      if (other.size() == 2) {
        nums.add(i);
      }
    }

    if (nums.size() == 0) {
      System.out.println(-1);
    } else {
      // 전체 합과 가장 작은 수 구하기
      int sum = 0;
      int min = nums.get(0);
      for (int n : nums) {
        sum += n; // 합
        if (min > n) { // 최소값
          min = n;
        }
      }
      System.out.println(sum);
      System.out.println(min);
    }
    
    br.close();
  }
}

v2

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

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

    int M = Integer.parseInt(br.readLine());
    int N = Integer.parseInt(br.readLine());

    List<Integer> primes = new ArrayList<>();

    // 소수 판별하여 primes에 추가
    for (int i = M; i <= N; i++) {
      if (isPrime(i)) {
        primes.add(i);
      }
    }

    if (primes.isEmpty()) {
      System.out.println(-1); // primes에 값이 없으면 -1
    } else {
      int sum = primes.stream().mapToInt(Integer::intValue).sum();
      int min = Collections.min(primes);
      System.out.println(sum);
      System.out.println(min);
    }
  }

  // 소수 판별
  private static boolean isPrime(int num) {
    // num이 2미만이면 false. 1은 소수가 아니기 때문.
    if (num < 2) return false;

    // 루트 num이 i로 나누었을 때 나머지가 0이면 소수가 아님.
    // 왜냐하면 소수는 1과 본인과 같은 수만 있기 때문에.
    for (int i = 2; i <= Math.sqrt(num); i++) {
      if (num % i == 0) return false;
    }
    
    return true;
  }
}

# 입/출력 결과

v1


v2

 


# 과정

v1

// 풀이 내용: 
// 1. BufferedReader로 입력값 받기.
// 2. int M, int N에 각각 입력값 받기.
// 3. 소수인 값을 담기 위해 nums를 ArrayList로 선언.
// 4. M~N 사이를 순환하기 위해 for문 사용.
// 5. M~N 사이의 나머지가 0인 자연수를 ArrayList<Integer> 타입의 other을 생성하고 .add()메서드를 사용하여 추가하기.
// 6. other의 크기가 2인 값을 구하여 nums에 추가하기.
// 7. if문을 사용하여 nums에 값이 없으면 -1을 출력, 그러지 않으면 nums의 요소들을 전체 합한 값은 sum, 가장 작은 수를 min에 저장하여 출력.

v2

// 풀이 내용: 
// 1. BufferedReader로 입력값 받기.
// 2. int M, int N에 각각 입력값 받기.
// 3. 소수인 값을 담기 위해 primes를 ArrayList로 생성.
// 4. for문을 사용하여 M~N사이의 자연수 중 소수를 판별하여 primes에 추가.
//    - isPrime 메서드를 생성하여 소수 판별함.
// 5. 소수 판별하는 isPirme 메서드 boolean 타입으로 생성.
//    - isPirme으로 넘어온 파라미터를 int num으로 함.
//    - num < 2 이면 false를 return. (소수는 1 이상의 자연수)
//    - for문 사용하여 조건식에 int i = 2; int i < Math.sqrt(num); i++ 로 지정.
//    - 블럭에는 num % i 가 0이면 false를 return함. (num을 i로 나누었을 때 0으로 떨어지면 소수가 아님. 소수는 1과 본인과 동일한 수만 가지기 때문에.)
//    - 위에 조건들이 부합하지 않으면 true를 return함.
// 6. 본 코드로 돌아와서 primes에 아무런 값이 없으면 -1을 출력하고, 값이 있으면 primes안에 있는 요소의 총 합과 가장 작은 수를 구하여 출력.
//    - 총 합은 .stream()을 사용하여 .mapToInt()로 숫자로 형변환 한 다음에 전체 값을 .sum() 메서드 사용하여 전체 합을 구함.
//    - Collections 클래스를 사용하여 .min() 메서드로 primes 리스트 안에 있는 요소 중 가장 작은 수를 구하기.

# 메모

  • if문, for문을 사용하여 코드를 작성할 수는 있으나, 그 다음 step으로 넘어가기에는 부족하다는 걸 느꼈다.
  • 자주 사용되는 클래스, 메서드 이런걸 더 알아야하고 사용 방법을 알아야한다는 계기가 되었다.