코딩 테스트

[코딩테스트] 백준 1978번: 소수 찾기

dev.jelee 2025. 8. 1. 00:39

# 문제

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


# 코드

v1

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

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

    int N = Integer.parseInt(br.readLine()); // 입력 개수
    String[] n = br.readLine().split(" "); // 공백 기준으로 나누어 저장
    int count = 0; // 소수의 개수

    for (int i = 0; i < N; i++) {
      // 나머지 0인 값 구해서 nums에 저장
      String nums = "";
      for (int j = 1; j <= Integer.parseInt(n[i]); j++) {
        if (Integer.parseInt(n[i]) % j == 0) {
          nums = nums + j + " ";
        }
      }

      // nums를 공백 기준으로 나눈 2개이면 count++
      String[] result = nums.split(" ");
      if (result.length == 2) {
        count++;
      }
    }

    System.out.println(count);
    br.close();
  }
}

v2

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

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

    br.readLine();
    long primeCount = Arrays.stream(br.readLine().split(" "))
        .mapToInt(Integer::parseInt) //int 타입으로 변경
        .filter(BOJ1978_v2::isPrime) // isPrime 함수 호출하여 filter
        .count();
    
    System.out.println(primeCount);
    br.close();
  }

  private static boolean isPrime(int n) {
    if (n < 2) return false;
    return java.util.stream.IntStream.rangeClosed(2, (int) Math.sqrt(n))
        .noneMatch(i -> n % i == 0);
  }

  // rangeClose(a,b ): a 이상 b 이하
  // .sqrt(): 루트
  // .nonMatch(): 일치하는게 없어야 true, 일치하면 false
  // i는 .rangeClosed에서 구해진 각각의 값

}

# 입/출력 결과


# 과정

v1

// 풀이 내용: 
// 1. BufferedReader로 입력값 받기.
// 2. int N에 입력 개수 받기.
// 3. String[] n에 공백 기준으로 나누어 입력값 배열로 저장.
// 4. int count = 0; 소수가 몇 개인지 세기 위한 카운트 선언 및 초기화.
// 5. for문 사용하여 N번 반복.
// 6. 중첩 for문으로 n의 각 요소 만큼 반복하면서 String nums에 j번째 값을 저장.
// 7. String nums를 공백 기준으로 나누어 String[] result에 저장.
// 8. result의 length가 2이면 소수이므로 count++ 시켜주기.
// 9. count 출력.

v2

// 풀이 내용: 
// 1. BufferedReader로 입력값 받기.
// 2. br.readLine(); 첫번째 개수 입력 받기.
// 3. .stream()을 사용하여 계산.
//    - 입력 받은 값을 공백 기준으로 나누어 .mapToInt() 각 int 타입으로 변경
//    - .filter()를 사용하여 isPrime 함수 호출하여 대입.
//    - .isPrime()에서 true로 반환된 것을 count() 하기.
// 4. isPrime 함수 생성하여 int n을 파라미터로 받기.
//    - int n이 2보다 작으면 false를 return. (1은 소수가 아니기 때문)
//    - rangeClosed(a, b)사용하여 a는 2, b는 int n을 루트로 계산하기.
//    - 루트로 계산한 n은 (int)로 강제 형변환.
//    - .noneMatch()를 사용하여 int n을 i로 나누었을 때 0이면 false 반환.
//    - i는 rangeClosed()에서 계산한 각각의 값을 의미.

# 메모

v2는 chat-gpt한테 v1의 코드(내가 작성한)를 리팩토링 해달라고 해서 작성한 코드이다.

.stream()을 사용하고 함수를 생성하여 보다 짧고 효율적인 코드를 작성할 수 있었다.

.steram()을 공부는 했어도 어떤 상황에서 사용하는 것이 좋을지를 모르다보니 주로 if문 for문만 사용하게 된다.