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(): 스트림의 각 요소를 변환하거나 다른 값으로 매핑할 때 사용됩니다.
'문제 풀이 > 프로그래머스 알고리즘' 카테고리의 다른 글
문자열 내 마음대로 정렬하기 // Arrays.sort(), Comparator<T> (1) | 2024.10.14 |
---|---|
이상한 문자 만들기 // String.split(), Character.toUpperCase() (1) | 2024.10.10 |
행렬의 덧셈 // 이중for문, 스트림 (0) | 2024.10.07 |
문자열 다루기 기본 // Character.isDigit() (0) | 2024.10.06 |
약수의 개수와 덧셈 // for문 , if문 사용 + stream 사용 (0) | 2024.10.05 |