ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 LV1] 나머지가 1이 되는 수 찾기
    [프로그래머스] 2024. 5. 19. 01:46

    문제 설명

    자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.


    제한사항

    • 3 ≤ n ≤ 1,000,000

    입출력 예

    n result

    10 3
    12 11

    입출력 예 설명

    입출력 예 #1

    • 10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.

    입출력 예 #2

    • 12를 11로 나눈 나머지가 1이고, 11보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 11을 return 해야 합니다.

    풀이과정

    1. 범위 2 ~ n-1 IntStream
    2. 나머지 1 인수 필터링
    3. 최솟값 찾기
    import java.util.stream.*;
    
    class Solution {
        public int solution(int n) {
            return IntStream.rangeClosed(2, n - 1)
    						            .filter(i -> n % i == 1)
    						            .min()
    						            .getAsInt();
        }
    }
    

    배운점

    처음에 쓴 코드는 나머지가 1인거 필터링 하고 min()하고 끝냈다

    import java.util.stream.*;
    
    class Solution {
        public int solution(int n) {
            return IntStream.rangeClosed(2, n - 1)
    						            .filter(i -> n % i == 1)
    						            .min();
        }
    }
    
    /Solution.java:7: error: incompatible types: OptionalInt cannot be converted to int
                .min(); // 오류뜸 ㅅㅂ;;
                
    

    그런데 이런 오류가 나와서 확인해보니

    IntStream 의 min() 메서드는 필터링 후에 ( 필터링 된 값이 없을경우) 최소값이 존재하지 않을 수도 있기 때문에 OptionalInt를 반환하는데 예외를 던지는 대신 이를 처리할 수 있는 방법을 제공해야한다.

    • 과가 없는 경우를 처리 하는 방법
    1. orElse()
    import java.util.stream.*;
    
    class Solution {
        public int solution(int n) {
            return IntStream.rangeClosed(1, n - 1)
                            .filter(i -> n % i == 1)
                            .min()
                            .orElse(-1); // 결과가 없을 경우 -1 반환
        }
    }
    
    1. getAsInt()_ver1
    import java.util.*;
    import java.util.stream.*;
    
    class Solution {
        public int solution(int n) {
            OptionalInt min = IntStream.rangeClosed(1, n - 1)
                                       .filter(i -> n % i == 1)
                                       .min();
            return min.isPresent() ? min.getAsInt() : -1; // min 값이 존재하면 min 의 값을 반환 , 없으면 -1
        }
    }
    
    1. getAsInt()_ver2
    import java.util.stream.*;
    
    class Solution {
        public int solution(int n) {
            return IntStream.rangeClosed(1, n - 1)
                            .filter(i -> n % i == 1)
                            .min()
                            .getAsInt(); // 값이 있는게 확실해서 결과값만 받아옴
        }
    }
    

    나는 3번이 더 간단해서 이걸루 함 ㅋ


    참고자료

    getAsInt()_ver2

    https://velog.io/@lynnchoi0126/JAVA-OptionalInt-cannot-be-converted-to-int

    Stream / Optional

    https://velog.io/@gjrjr4545/JAVA-8-3-Stream-Optional의-등장

    OptionalInt & Optional<T>

    https://jamie95.tistory.com/107

Designed by Tistory.