프로그래머스 배열 만들기 6

KIMYEONGJUN·2026년 7월 19일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

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 합니다.

내가 이 문제를 보고 생각해본 부분

Stack<Integer> stk = new Stack<>();를 통해 스택을 생성한다. 이 스택은 새 배열을 만드는 임시 저장소 역할을 한다.
변수 i를 0으로 초기화하여 입력 배열 arr를 순차적으로 탐색한다.
while(i < arr.length) 반복문은 배열의 모든 원소를 처리할 때까지 반복한다.
만약 스택이 비어있다면 stk.push(arr[i])를 수행해 현재 원소를 추가하고, i를 1 증가시킨다.
스택이 비어있지 않다면 스택의 최상단 원소(stk.peek())와 현재 원소 arr[i]를 비교한다.
같으면 stk.pop()으로 최상단 원소를 제거하고 i를 증가시켜 다음 원소로 이동한다.
다르면 현재 원소를 스택에 추가하고 i를 증가시킨다.
모든 원소를 처리한 후 스택이 비어있으면 조건에 따라 -1을 담은 배열을 반환한다.
스택에 원소가 남아 있으면 이를 배열로 변환하는데, 스택에서 팝을 하면 역순으로 나오므로 뒤에서부터 채워 넣어 원래 순서를 유지한다.
main 메서드에서는 세 가지 테스트 케이스를 직접 실행하고 결과를 출력하여 동작을 검증한다.

코드로 구현

import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        Stack<Integer> stk = new Stack<>();
        int i = 0;

        while (i < arr.length) {
            if (stk.isEmpty()) {
                stk.push(arr[i]);
                i++;
            } else {
                if (stk.peek() == arr[i]) {
                    stk.pop();
                    i++;
                } else {
                    stk.push(arr[i]);
                    i++;
                }
            }
        }

        if (stk.isEmpty()) {
            return new int[]{-1};
        }

        int[] answer = new int[stk.size()];
        for (int j = stk.size() - 1; j >= 0; j--) {
            answer[j] = stk.pop();
        }
        return answer;
    }
}

프로그래머스 코드

package programmers;

import java.util.Arrays;
import java.util.Stack;

// 프로그래머스 배열 만들기 6
public class Main86 {
    public static int[] solution(int[] arr) {
        Stack<Integer> stk = new Stack<>();
        int i = 0;

        while (i < arr.length) {
            if (stk.isEmpty()) {
                stk.push(arr[i]);
                i++;
            } else {
                if (stk.peek() == arr[i]) {
                    stk.pop();
                    i++;
                } else {
                    stk.push(arr[i]);
                    i++;
                }
            }
        }

        if (stk.isEmpty()) {
            return new int[]{-1};
        }

        int[] answer = new int[stk.size()];
        for (int j = stk.size() - 1; j >= 0; j--) {
            answer[j] = stk.pop();
        }
        return answer;
    }

    public static void main(String[] args) {
        int[] test1 = {0, 1, 1, 1, 0};
        int[] result1 = solution(test1);
        System.out.println(Arrays.toString(result1)); // [0, 1, 0]

        int[] test2 = {0, 1, 0, 1, 0};
        int[] result2 = solution(test2);
        System.out.println(Arrays.toString(result2)); // [0, 1, 0, 1, 0]

        int[] test3 = {0, 1, 1, 0};
        int[] result3 = solution(test3);
        System.out.println(Arrays.toString(result3)); // [-1]
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글