CODING/CS, 알고리즘, 자료구조 공부

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

codingTrip 2025. 5. 28. 12:17

나의 풀이

class Solution {
    public int solution(int n) {
        int answer = 0;
        int i = 1;
        while(true) {
            if (n % i == 1) {
                answer = i;
                break;
            }
            i++;
        }
        return answer;
    }
}

while문을 사용했다.

n을 i로 나눴을 때 나머지가 1이 되는 가장 작은 수를 구해야 해서

i를 1로 초기화하고 처음으로 나머지가 1이 될 때, while문을 종료했다.

 

다른 사람의 풀이

class Solution {
    public int solution(int n) {
        int answer = 1;

        while(true) {
            if (n%answer==1) break;
            answer++;
        }

        return answer;
    }
}

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/87389/solution_groups?language=java

i라는 변수를 추가로 사용하지 않고, answer 변수를 1로 초기화해서 사용했다.

메모리 효율면에서 내가 작성한 코드보다 더 좋다고 생각한다.

 

위 게시글 댓글에는 아래와 같은 방법을 제시하기도 했다.

내 생각에는 이 방법이 더 참신하다고 생각한다.

while (n % answer != 1){ 
    answer ++;
}

 

또한 intStream을 사용하신 분들도 계셨다.

단순한 경우에는 stream을 사용하는 것이 더 비효율적이라는 의견도 있었지만

나의 경우에는 stream과 친해지기 위해 이참에 조금씩 익숙해지면서 공부해야겠다는 생각이 들었다.

import java.util.stream.IntStream;

class Solution {
    public int solution(int n) {
        return IntStream.range(2, n)
                .filter(i -> n % i == 1)
                .findFirst()
                .orElse(0);
    }
}

🔸 IntStream.range(2, n)

  • 2부터 n - 1까지의 숫자를 순차적으로 스트림으로 만듭니다.
  • 예: n = 10이면 2, 3, 4, 5, 6, 7, 8, 9

🔸 .filter(i -> n % i == 1)

  • 각 수 i에 대해 n % i == 1인 조건을 만족하는 값만 남깁니다.
  • 예: 10 % 3 == 1, 10 % 9 == 1 → 3, 9만 남습니다.

🔸 .findFirst()

  • 필터 조건을 만족하는 첫 번째 수를 반환합니다.
  • OptionalInt로 반환되기 때문에,

🔸 .orElse(0)

  • 만약 조건을 만족하는 수가 하나도 없다면 기본값 0을 반환합니다.