프로그래머스 같은 숫자는 싫어 문제풀이

김하영·2023년 3월 14일
0

문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12906

사용 자료구조: 스택

인자로 받은 배열을 역순으로로 탐색하고 차례대로 그 결과를 출력하기 위해 스택을 선택했다.


찾아낸 규칙

배열의 데이터를 역순으로 살펴보면서 스택에 넣는데 그때 연속된 수를 피하기 위해 스택의 peek을 확인하고 그와 같으면 넣지 않고 다르면 스택에 넣어준디!


코드설명

배열의 각 숫자를 역순으로 순회하면서, 만약 스택이 비어있다면 해당 숫자를 넣어준다. 비어있지 않다면 스택의 peek을 확인해 본다. 만약 Peek과 현재 숫자가 같다면 연속된 숫자이므로 스택에 넣지 않는다. 다르다면 연속된 숫자가 아니므로 스택에 넣어준다.

배열을 역순으로 순회하였으므로 배열의 가장 첫번째 숫자가 스택의 맨 위에 있게 된다. 따라서 스택에서 숫서대로 pop하면서 정답 배열을 만들어준다. 그러면 배열에서 연속되지 않은 숫자들만 순서대로 나오게 된다.

package stackPractice;

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        int[] answer;

        Stack<Integer> stack = new Stack<>();
        for(int i = arr.length-1; i>=0; i--){
            if(stack.isEmpty()){
                stack.push(arr[i]);
            } else if(stack.peek() != arr[i]){
                stack.push(arr[i]);
            }
        }
        answer = new int[stack.size()];
        int idx = 0;
        while(!stack.isEmpty()){
           answer[idx++] = stack.pop();
        }
        return answer;
    }

//    public static void main(String[] args) {
//        System.out.println(new Solution().solution(new int[]{1,1,3,3,0,1,1}));
//    }
}

시행착오

문제를 똑바로 안읽었다. 스택에 연속한 숫자를 제외하고 넣어야 했는데, 스택에 이미 들어간 숫자는 넣지 않도록 stack.contains(숫자)를 사용해서 코드를 작성했었다. 그래서 첫번째 예시인 [1,1,3,3,0,1,1]의 결과가 [1,3,0,1]이 아닌 [3,0,1]이 나왔었다..ㅎ
문제를 꼼꼼히 읽자고 한번 더 다짐했다...!!

profile
백엔드 개발자로 일하고 싶어요 제발

0개의 댓글