- 문제설명
- 예시
- 해결과정
- 문제 분류가 스택/큐여서 처음에는 의아했다. 스택/큐를 이용하지 않아도 바로 풀 수 있을 것 같은데..
- 그래도 스택/큐를 이용해서 풀어보고자 했다!
- 먼저 큐에 모든 입력을 다 담아준다.
- 먼저 하나를 poll() 하고, while문을 이용해 peek()값과 이전의 poll()값이 똑같다면 다시 poll()하도록 만들었다.
- 이렇게 중복값을 없애고 결과 리스트에 담아준다. 아래는 실제 코드이다.
import java.util.*;
public class Solution {
public int[] solution(int[] arr) {
Queue<Integer> q = new LinkedList<>();
ArrayList<Integer> result = new ArrayList<>();
for(int a : arr) q.add(a);
while(!q.isEmpty()) {
int temp = q.poll();
try {
while(temp == q.peek()) {
q.poll();
}
result.add(temp);
} catch(NullPointerException e) {
result.add(temp);
}
}
return result.stream()
.mapToInt(i -> i)
.toArray();
}
}
- 결과적으로 유효성 검사를 일부만 통과하고 완벽하게 통과하지 못했다.
- 큐에 담아놓은 후에 중복값을 없애는 부분에서는 비효율적인 부분을 찾지 못했다.
- 결국 큐에 모든 값을 일단 담아놓고 시작한다는 점이 문제가 아닐까 싶어서 큐를 이용하지 않기로 했다!
- 동일한 논리로, 입력 배열을 바로 순회하면서 이전값과 현재값이 같지 않을때만 결과 리스트로 더해주었다.
- 효율성 검사도 통과했다!
- 솔루션
import java.util.*;
public class Solution {
public int[] solution(int[] arr) {
ArrayList<Integer> result = new ArrayList<>();
int previous = -1;
for(int present : arr) {
if(present != previous) result.add(present);
previous = present;
}
return result.stream()
.mapToInt(i -> i)
.toArray();
}
}
- 정리
- 문제 대분류에 너무 의식하지 말자. 실제 코딩테스트에서도 특정 알고리즘을 사용하면 된다고 알려주지 않는다.
- 데이터를 가공할 때 스트림 & 람다를 적극 활용하자