51. [Java] 배열만들기 6
https://school.programmers.co.kr/learn/courses/30/lessons/181859
- stk가 비어 있으면 → arr[i]를 stk에 추가하고 i++
- stk에 값이 있고, stk의 마지막 값 == arr[i] → stk의 마지막 값을 제거하고 i++
- stk에 값이 있고, stk의 마지막 값 != arr[i] → arr[i]를 stk의 맨 뒤에 추가하고 i++
- 단, 만약 빈 배열을 return 해야한다면 [-1]을 return
- 1 ≤ arr의 길이 ≤ 1,000,000
- arr의 원소는 0 또는 1 이다.
정답코드
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
ArrayList<Integer> stk = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if (!stk.isEmpty()) {
if (stk.get(stk.size() - 1) == arr[i]) {
stk.remove(stk.size() - 1);
} else if (stk.get(stk.size() - 1) != arr[i]) {
stk.add(arr[i]);
}
}
else {
stk.add(arr[i]);
}
}
if (stk.isEmpty()) {
stk.add(-1);
}
return stk.stream().mapToInt(Integer::intValue).toArray();
}
}
- 빈 리스트(
stk
)를 스택처럼 사용한다. - 배열을 순회하면서:
- 스택이 비었으면 현재 값을 그냥 넣는다.
- 스택이 비어 있지 않으면, 마지막 값(
stk.get(stk.size() - 1)
) 확인- 같으면 pop (제거)
- 다르면 push (추가)
- 마지막에 리스트를 배열로 변환해서 return
오답
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
ArrayList<Integer> stk = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if (!stk.isEmpty()) {
if (stk.get(stk.size() - 1) == arr[i]) {
stk.remove(stk.size() - 1);
} else if (stk.get(stk.size() - 1) != arr[i]) {
stk.add(arr[i]);
}
}
else {
stk.add(arr[i]);
}
}
return stk.stream().mapToInt(Integer::intValue).toArray();
}
}
처음에는pop()
메서드를 써서 코드를 한 번 수정했다. Java의 ArrayList
는 pop()
메서드를 지원하지 않는다. pop()
은 Stack
자료구조에서 사용하는 메서드이고, ArrayList
에서는 대신 remove()
메서드를 써야 한다. 그리고 remove()
의 매개변수는 인덱스이다.
또 이 코드에서 ArrayList
의 마지막값 확인은 stk.get(stk.size() - 1)
로 한다.
테스트 케이스가 통과되지 않은 이유는 단, 만약 빈 배열을 return 해야한다면 [-1]을 return 하는 조건을 간과했기 때문이다. 이 로직을 작성하지 않아서 테스트 3이 오답처리 되었는데 아래 코드 추가해서 해결했다.
if (stk.isEmpty()) {
stk.add(-1);
}