문제 링크

  • 연속적으로 나타나는 숫자, 즉 앞의 숫자와 겹치면 제거하기 때문에 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();
    }