[프로그래머스, Java] 나머지가 1이 되는 수 찾기

2025. 7. 8. 18:18·CodingTest/Programmers

사진을 클릭하면 해당 문제로 이동

💡풀이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
'CodingTest/Programmers' 카테고리의 다른 글
  • [프로그래머스, Java] 문자열 내 p와 y의 개수
  • 프로그래머스, Java] 두 정수 사이의 합
  • [프로그래머스, Java] x만큼 간격이 있는 n개의 숫자
  • [프로그래머스, Java] 평균 구하기
devoks
devoks
꾸준히 작성해보자!
  • devoks
    ok's 개발 블로그
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기 (112) N
      • Backend (15)
        • SpringBoot (0)
        • Java (15)
      • Cs (18) N
      • Infra (0)
        • AWS (0)
        • Docker (0)
      • CodingTest (79)
        • Programmers (79)
  • 링크

    • My GitHub
  • 인기 글

  • 태그

    switch
    json
    java
    CS
    BufferedWriter
    effectivejava
    BufferedReader
    programmers
    codingtest
    StringTokenizer
  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[프로그래머스, Java] 나머지가 1이 되는 수 찾기
상단으로

티스토리툴바