💡풀이1
class Solution {
public int solution(int n) {
int x = 2;
while(true){
if(n%x==1) break;
x++;
}
return x;
}
}
💡풀이2
import java.util.stream.IntStream;
class Solution {
public int solution(int n) {
return IntStream.rangeClosed(2, n)
.filter(e -> n%e==1)
.findFirst()
.orElse(-1);
}
}
📖새롭게 배운 부분
Java Stream의 filter와 findFirst, 실제 동작 방식 정리
Java Stream을 사용할 때, filter와 findFirst가 어떻게 동작하는지 헷갈릴 수 있습니다. 특히, "filter가 전체 데이터를 모두 처리한 뒤, findFirst가 그 결과에서 첫 번째 값을 고른다"고 오해하기 쉽습니다. 하지만 실제로는 그렇지 않습니다.
실제 동작 순서
예를 들어, 아래와 같은 코드가 있다고 가정해보겠습니다.
java
public int solution(int n) {
return IntStream.rangeClosed(2, n)
.filter(e -> n % e == 1)
.findFirst()
.orElse(-1);
}
만약 n이 10이라면, 이 코드는 다음과 같이 동작합니다.
1. 2부터 시작해서 filter에 전달합니다.
2. 2는 10 % 2 == 0이므로 조건 불충족 → 다음 값으로 이동
3. 3은 10 % 3 == 1이므로 조건 충족 → filter 통과
4. findFirst가 즉시 3을 반환하고, 이후 값(4, 5, ..., 10)은 filter에 적용하지 않습니다.
즉, 조건을 만족하는 첫 번째 값을 찾는 순간 바로 반환하며, 그 뒤의 값들은 아예 처리하지 않습니다.
요약
Java Stream의 중간 연산(filter 등)은 최종 연산(findFirst 등)이 실행될 때까지 실제로 동작하지 않습니다(지연 평가, lazy evaluation)
각 요소에 대해 filter → findFirst가 순차적으로 적용됩니다.
findFirst는 조건을 만족하는 첫 번째 요소를 찾으면 즉시 탐색을 멈춥니다(쇼트 서킷)
filter가 전체를 모두 순회한 뒤 결과를 모으는 것이 아니라, 필요한 만큼만 filter가 적용됩니다.
Java Stream에서 filter와 findFirst를 함께 사용할 때는,
조건을 만족하는 첫 번째 요소를 찾는 순간 바로 반환하므로, 불필요하게 전체 데이터를 순회하지 않습니다.
쇼트서킷이란?
쇼트서킷(Short-Circuit) 간단 정리
쇼트서킷은 stream의 findFirst 등 조건이 충족되면 더 이상 연산을 진행하지 않고 바로 결과를 반환하는 방식입니다.
논리 연산자(&&, ||): 앞의 조건만으로 결과가 정해지면 뒤 조건은 평가하지 않습니다.
Java Stream: findFirst, anyMatch 등은 원하는 값을 찾으면 나머지 요소는 처리하지 않고 바로 종료합니다.
즉, 필요한 만큼만 연산하고, 불필요한 연산은 건너뛰어 효율을 높이는 기법입니다.
GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.
프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스, Java] 문자열 내 p와 y의 개수 (0) | 2025.07.08 |
---|---|
프로그래머스, Java] 두 정수 사이의 합 (0) | 2025.07.08 |
[프로그래머스, Java] x만큼 간격이 있는 n개의 숫자 (0) | 2025.07.08 |
[프로그래머스, Java] 평균 구하기 (0) | 2025.07.08 |
[프로그래머스, Java] 짝수와 홀수 (0) | 2025.07.08 |