문제 풀이/프로그래머스 알고리즘

최대공약수와 최소공배수 // 스트림 연습

열심히 해 2024. 10. 8. 13:50

https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

 

1.  아래 코드는 오류가 발생합니다. 

class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];

        // n, m 중 큰 값이 n이 되도록 스왑
        if (n < m) {
            int temp = n;
            n = m;
            m = temp;
        }

        // 최대공약수 (GCD) 찾기: n과 m의 공약수 중 가장 큰 값
        int gcd = IntStream.rangeClosed(1, m)
                .filter(i -> n % i == 0 && m % i == 0)
                .max()
                .orElse(1); // 최대공약수가 없으면 1 반환

        // 최소공배수 (LCM) 계산: (n * m) / GCD
        int lcm = (n * m) / gcd;

        answer[0] = gcd; // 최대공약수
        answer[1] = lcm; // 최소공배수

        return answer;
    }
}

 

**"Variable used in lambda expression should be final or effectively final"**는 람다 표현식 내에서 사용되는 변수가 수정 가능할 때 발생합니다. 자바에서는 람다식 안에서 사용하는 변수가 final이거나 **사실상 final(즉, 그 이후에 값이 변경되지 않는 변수)**이어야 합니다.

 

 

1-1 : 사실상의 final로 만들기

class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];

        // n, m 중 큰 값이 n이 되도록 스왑
        if (n < m) {
            int temp = n;
            n = m;
            m = temp;
        }

        int finalN = n;
        int finalM = m;

        // 최대공약수 (GCD) 찾기: n과 m의 공약수 중 가장 큰 값
        int gcd = IntStream.rangeClosed(1, m)
                .filter(i -> finalN % i == 0 && finalM % i == 0)
                .max()
                .orElse(1); // 최대공약수가 없으면 1 반환

        // 최소공배수 (LCM) 계산: (n * m) / GCD
        int lcm = (n * m) / gcd;

        answer[0] = gcd; // 최대공약수
        answer[1] = lcm; // 최소공배수

        return answer;
    }
}

 

 

1-2 : 매개 변수 n, m 중 큰 값을 찾아서 별도의 변수에 저장하기 위해 Math.max() , Math.min() 사용

class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];

        // n과 m을 스왑하는 대신, 별도의 변수로 처리
        final int larger = Math.max(n, m);
        final int smaller = Math.min(n, m);

        // 최대공약수 (GCD) 찾기: 공약수 중 가장 큰 값
        int gcd = IntStream.rangeClosed(1, smaller)
                .filter(i -> larger % i == 0 && smaller % i == 0)
                .max()
                .orElse(1); // 최대공약수가 없으면 1 반환

        // 최소공배수 (LCM) 계산: (n * m) / GCD
        int lcm = (n * m) / gcd;

        answer[0] = gcd; // 최대공약수
        answer[1] = lcm; // 최소공배수

        return answer;
    }
}

 

1-3 :  filter()를 map()으로 표현. 

class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];

        // n, m 중 큰 값이 n이 되도록 스왑
        if (n < m) {
            int temp = n;
            n = m;
            m = temp;
        }

        // 최대공약수 (GCD) 찾기: map을 사용하여 공약수는 그대로 두고, 나머지는 0으로
        int gcd = IntStream.rangeClosed(1, m)
                .map(i -> (n % i == 0 && m % i == 0) ? i : 0)
                .max()
                .orElse(1); // 최대공약수가 없으면 1 반환

        // 최소공배수 (LCM) 계산: (n * m) / GCD
        int lcm = (n * m) / gcd;

        answer[0] = gcd; // 최대공약수
        answer[1] = lcm; // 최소공배수

        return answer;
    }
}

 

 

 

  • filter(): 조건을 만족하는 요소만 남기기 위한 함수입니다. 조건을 만족하지 않는 요소는 스트림에서 제외됩니다.
  • map(): 스트림의 각 요소를 변환하거나 다른 값으로 매핑할 때 사용됩니다.