Skip to main content

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();
    }
}

image.png

처음에는pop() 메서드를 써서 코드를 한 번 수정했다. Java의 ArrayListpop() 메서드를 지원하지 않는다. pop()Stack 자료구조에서 사용하는 메서드이고, ArrayList에서는 대신 remove() 메서드를 써야 한다. 그리고 remove() 의 매개변수는 인덱스이다.

또 이 코드에서 ArrayList의 마지막값 확인은 stk.get(stk.size() - 1)로 한다.

테스트 케이스가 통과되지 않은 이유는 단, 만약 빈 배열을 return 해야한다면 [-1]을 return 하는 조건을 간과했기 때문이다. 이 로직을 작성하지 않아서 테스트 3이 오답처리 되었는데 아래 코드 추가해서 해결했다.

if (stk.isEmpty()) {
    stk.add(-1);
}