프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 배열 만들기 6(Java)

Sigfriede 2023. 6. 3. 01:00

  문제 설명

  0과 1로만 이루어진 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk을 만들려고 합니다.

  i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다.

  • 만약 stk이 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 stk에서 제거하고 i에 1을 더합니다.
  • stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면 stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.

위 작업을 마친 후 만들어진 stk을 return 하는 solution 함수를 완성해 주세요.

단, 만약 빈 배열을 return 해야한다면 [-1]을 return 합니다.

 

  제한사항

  • 1 <= arr의 길이 <= 1,000,000
    • arr의 원소는 0 또는 1 입니다.

 

  입출력 예

arr result
[0, 1, 1, 1, 0] [0, 1, 0]
[0, 1, 0, 1, 0] [0, 1, 0, 1, 0]
[0, 1, 1, 0] [-1]
import java.util.ArrayList;
class Solution {
    public int[] solution(int[] arr) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            if (list.isEmpty()) {
                list.add(arr[i]);
            } else if (list.get(list.size() - 1) == arr[i]) {
                list.remove(list.size() - 1);
            } else {
                list.add(arr[i]);
            }
        }
        
        int[] answer;
        if (list.size() == 0) {
            answer = new int[]{-1};
        } else {
            answer = new int[list.size()];
        }
        
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);    
        }
        return answer;
    }
}

  배열의 크기가 유동적이고, 원소의 삽입과 제거가 편리해야 하므로 ArrayList를 생성합니다. 

  for문이 arr의 길이만큼 순회합니다.

  if문에서 isEmpty 메소드를 이용하여 배열이 비어있는지 확인합니다. 만약 배열이 비어 있다면 add 메소드를 이용하여 list에 arr의 i번째 원소를 삽입합니다.

  else if에서 get 메소드를 이용하여 list의 마지막 원소가 arr의 i번째 원소와 같은지 확인합니다. 만약 같다면 remove 메소드를 이용하여 list의 마지막 원소를 제거합니다.

  else에서 만약 앞선 조건에 해당하지 않는다면 add 메소드를 이용하여 list에 arr의 i번째 원소를 삽입합니다.

  i가 증가한다든지, else if와 else에서 배열이 비어있는지 조건은 별도로 작성하지 않았습니다. i가 증가하는지 확인하지 않는 이유는 문제에서 제시한 세 가지 상황에서 모두 i가 증가하기 때문입니다. 또, 뒤의 두 조건에서 배열이 비어있는지 확인하지 않는 이유는 이미 배열이 비어있는지 확인한 이후이기 때문에, 만약 배열이 비었다면 앞에서 걸러졌을 것입니다.

  answer 배열을 생성합니다.

  if문에서 만약 list의 size가 0이라면 빈 배열이라는 뜻이므로 answer가 -1을 반환하도록 할당합니다. 빈 배열이 아니라면 배열의 크기를 list의 크기와 맞춰줍니다.

  두 번째 for문은 ArrayList를 Array에 복사하는 과정입니다. i가 list의 크기만큼 순회하면서 answer의 i번째 원소에 list의 i번째 원소를 할당합니다.