본문 바로가기

프로그래머스(Java)/Level 0

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

728x90

코드 힌트

  1. 스택을 활용한 문제 해결:
    • 스택을 사용하여 인접한 동일한 요소를 제거합니다. 스택은 후입선출(Last In, First Out) 구조를 갖기 때문에 최근에 추가된 요소를 먼저 처리할 수 있습니다.
  2. 스택의 비어있음 확인:
    • stack.isEmpty()를 사용하여 스택이 비어 있는지를 확인합니다. 스택이 비어 있을 때는 현재 요소를 추가하고 계속 진행합니다.
  3. 스택의 최상위 요소 확인:
    • stack.peek()를 사용하여 스택의 최상위 요소를 확인합니다. 현재 요소와 비교하여 동일한 경우에는 스택에서 제거(stack.pop())합니다.
  4. 조건에 따른 스택 조작:
    • 현재 요소가 스택의 최상위 요소와 동일하면 제거하고, 그렇지 않으면 스택에 추가합니다. 이 작업을 반복하여 인접한 동일한 요소 쌍을 제거합니다.
  5. 스택 비어있음 처리:
    • 모든 요소를 처리한 후 스택이 비어 있으면 결과로 [-1]을 반환합니다. 스택이 비어 있지 않으면, 스택의 요소를 배열로 변환하여 반환합니다.
  6. 배열로 변환:
    • 스택의 요소를 배열로 변환할 때, 스택에서 요소를 하나씩 꺼내서 배열에 저장합니다. 배열은 스택의 최상위 요소부터 차례로 포함됩니다.

 


정답은 더보기 클릭

더보기
import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        // 요소를 담을 스택
        Stack<Integer> stack = new Stack<>();
        
        // i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다.
        for (int i = 0; i < arr.length; i++) {
            // 만약 stk이 빈 배열일 때
            if (stack.isEmpty()) {
                stack.push(arr[i]); // arr[i]를 stk에 추가
                continue;           // i에 1을 더합니다. (continue로 다시 for문 시작 즉 + 1이 됨)
            }
            // stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같을 때
            if (stack.peek() == arr[i]) {
                stack.pop(); // stk의 마지막 원소를 stk에서 제거
                continue;    // i에 1을 더합니다.
            }
            
            // stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면 stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.
            // 위 if조건을 전부 지났을 때 자동으로 충족되기 때문에 조건문 사용할 필요 없음
            stack.push(arr[i]);
        }
        // 마지막에 빈 배열이 되었으므로 [-1]을 return 합니다.
        if (stack.isEmpty()) {
            return new int[]{-1};
        }
        
        int[] result = new int[stack.size()];
        for (int i = result.length-1; i >= 0; i--) {
            result[i] = stack.pop();
        }
        return result;
    }
}
728x90