프로그래머스 - 같은 숫자는 싫어 풀이
문제 링크
- 연속적으로 나타나는 숫자, 즉 앞의 숫자와 겹치면 제거하기 때문에 Stack을 사용해서 풀이를 해보려고 한다.
풀이
첫번째
public int[] firstSolution(int[] arr) {
Stack<Integer> answer = new Stack<>();
answer.add(arr[0]);
for (int i = 1; i < arr.length - 1; i++) {
if (answer.peek() == arr[i]) {
continue;
}
answer.add(arr[i]);
}
return answer.stream().mapToInt(i -> i).toArray();
}
- 이렇게 했더니 33.7점 나옴…
arr.length - 1
부분이 오답 →arr.length
라고 해야 배열 끝까지 확인함- 리턴값이 틀린 줄 알았는데 저 부분은 맞음
두번째
public int[] secondSolution(int[] arr) {
Stack<Integer> answer = new Stack<>();
for (int nun : arr) {
if (answer.isEmpty() || answer.peek() != num) {
answer.add(num);
}
}
return answer.stream().mapToInt(i -> i).toArray();
}
- 한 줄이라도 더 줄이기 위해 스택에 배열의 첫번째 값을 넣는 코드(
answer.add(arr[0]
)를 제거하고, if문에answer.isEmpty()
로 바꿈 - 따라서 index를 쓸 필요가 없기 때문에 향상된 for문으로 조금 더 가독성 있게 작성
참고
- 다른 사람들 풀이를 보니 Stack을 사용하지 않은 사람도 많았다. Stack 클래스를 사용하는 것도 좋지만, 다른 클래스를 사용한 코드들도 많이 참고해서 이해력을 높여봐야겠다.
public int[] otherSolution(int[] arr) { ArrayList<Integer> answer = new ArrayList<>(); int prev = 10; // 이전값 저장 for (int num : arr) { if (prev != num) { answer.add(num); } prev = num; } return answer.stream().mapToInt(i -> i).toArray(); }