본문 바로가기
Coding Test/Java Coding Test

[프로그래머스 / 자바] - 배열 만들기 6

by nam_ji 2024. 8. 1.

배열 만들기 6

문제

  • 정수 배열 arr이 매개변수로 주어집니다.
  • arr은 0과 1로만 이루어져 있습니다.
  • 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를 출력하는 문제입니다. 단, 빈 배열은 [-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]


테스트 (인텔리제이)

  • 조건을 보면 i는 0으로 초기화 선언 해두고 i가 arr의 크기보다 작으면 주어진 조건을 반복해서 수행하라고 해서 while문을 사용했습니다.
  • while문은 i가 arr보다 커지면 멈추도록 하고
  • 내부에서 첫 if문에는 answer가 빈 배열이면 arr의 i인덱스에 있는 원소를 추가하라는 조건을 수행합니다.
    isEmpty 메서드로 빈 배열인지 체크하고 true면 add 메서드에 arr[i] 원소를 추가하도록 합니다.
  • 조건을 보면 두번째와 세번째는 빈배열이 아닐 시라는 공통 조건으로 첫 if문에서 처리했기 때문에 answer의 배열 체크는 하지 않고 answer의 마지막 원소가 arr[i] 원소와 같은지 체크하는 equals 메서드를 사용하여 true면 answer의 remove 메서드로 마지막 원소를 삭제합니다.
    remove 메서드에는 answer의 크기를 알려주는 size 메서드를 사용하고 배열의 시작은 0부터이기 때문에 1을 빼준 인덱스의 원소를 삭제합니다.
  • 마지막은 첫 if문과 두번째 if문의 조건과 반대되는 조건이기 때문에 else를 사용하여 answer에 arr[i] 원소를 추가해줍니다.
  • 여기서 또 공통의 조건으로 각 if문 들이 수행하고 나면 i에 1을 추가해주는 조건이 있기 때문에 while문 마지막에 i++을 사용하여 i에 1을 더해주도록 했습니다.
  • while문이 멈추면 최종 answer가 빈 배열인지 if문으로 체크하여 빈 배열이면 -1을 추가하여 출력하도록 했습니다.
package com.namji.codingtest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class 배열_만들기_6 {
  public static void main(String[] args) {
    /*
    정수 배열 arr이 매개변수로 주어집니다.
    arr은 0과 1로만 이루어져 있습니다.
    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를 출력하는 문제입니다.
    단, 빈 배열은 [-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]
     */

    int[] arr = {0, 1, 1, 0};
    int i = 0;
    List<Integer> answer = new ArrayList<>();
    while (i < arr.length) {
      if (answer.isEmpty()) {
        answer.add(arr[i]);
      } else if (answer.get(answer.size() - 1).equals(arr[i])) {
        answer.remove(answer.size() - 1);
      } else {
        answer.add(arr[i]);
      }
      i++;
    }
    if (answer.isEmpty()) {
      answer.add(-1);
    }

    System.out.println(answer);
  }
}

프로그래머스 코드

class Solution {
    public List solution(int[] arr) {
        List<Integer> answer = new ArrayList<>();
        int i = 0;
        
        while (i < arr.length) {
            if (answer.isEmpty()) {
                answer.add(arr[i]);
            } else if (answer.get(answer.size() - 1).equals(arr[i])) {
                answer.remove(answer.size() - 1);
            } else {
                answer.add(arr[i]);
            }
            i++;
        }
        if (answer.isEmpty()) {
            answer.add(-1);
        }
        
        return answer;
    }
}