큰 문제 없이 풀었는데, 저번에 헷갈린 걸 또 헷갈려서 적어두러 옴.
import java.util.Stack;
class Solution {
public int[] solution(int[] arr) {
int i = 0;
Stack<Integer> stk = new Stack<>();
while(i < arr.length) {
if(stk.empty()) stk.push(arr[i++]);
else {
if(stk.peek() == arr[i]) {
stk.pop();
i++;
} else {
stk.push(arr[i++]);
}
}
}
if(stk.empty()) return new int[]{-1};
return stk.stream().mapToInt(e -> e).toArray();
}
}
ArrayList로도 풀 수 있는 문제긴 한데, 문제에서 이미 stk라고 힌트를 주고 있길래 스택으로 풂.
여튼, 저번에도 내가 비슷하게 toArray 하는 문제에서 mapToInt(i -> i)가 안 돼서 당황한 적이 있다.
근데 오늘도 같은 문제가 생김. 근데 저번에 그게 뭐였는지 기억이 안나는 것...
정답은 i 였습니다^^...
i -> i 이런 방식은 자바에서 람다 표현식의 일부로, 여기서 i는 람다 매개변수임.
그렇다. 그게 문제였던 것이다...
람다 표현식 내에서의 매개변수 이름은 외부 범위에서의 변수 이름과 중복될 수 없음. (컴파일 단계에서 막힘)
람다 표현식은 자체적인 범위(scope)를 가지기 때문에 외부 범위에서 선언된 변수와 이름이 충돌하면 안 되는 것임.
문제야 mapToInt(Integer::intValue) 해서 풀어도 되지만 람다식이 훨씬 단순하니까...
그리고 메서드를 직접적으로 호출해버리면 메서드 호출 오버헤드를 신경써야 한다. 스택 영역에서 메서드를 저장하고 프레임에 어쩌구 저쩌구... 여튼. 이런 연산에서는 무시할 만한 수준이지만, 코드가 많아지면 하나하나가 쌓이는 법이다.
하여튼 i를 이미 위에서 지역 변수로 사용하고 있기 때문에 람다 매개변수로는 e를 사용해서 해결했다.
'Study with me > 프로그래머스 L0 마스터하기' 카테고리의 다른 글
프로그래머스 - L0 두수의합 (1) | 2024.04.19 |
---|---|
프로그래머스 - L0 왼쪽오른쪽 (0) | 2024.04.18 |
프로그래머스 - L0 소인수분해 (0) | 2024.04.12 |
프로그래머스 - L0 조건에맞게수열변환하기2 (0) | 2024.04.11 |
프로그래머스 - L0 이진수더하기 (0) | 2024.04.10 |