문제 풀이/프로그래머스 알고리즘
최대공약수와 최소공배수 // 스트림 연습
열심히 해
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(): 스트림의 각 요소를 변환하거나 다른 값으로 매핑할 때 사용됩니다.