# 문제
주소: 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문만 사용하게 된다.
'코딩 테스트' 카테고리의 다른 글
[코딩테스트] 백준 11653번: 소인수분해 (0) | 2025.08.03 |
---|---|
[코딩테스트] 백준 2581번: 소수 (0) | 2025.08.02 |
[코딩테스트] 백준 9506번: 약수들의 합 (0) | 2025.07.28 |
[코딩테스트] 백준 2501번: 약수 구하기 (0) | 2025.07.28 |
[코딩테스트] 백준 5086번: 배수와 약수 (0) | 2025.07.28 |