본문 바로가기
Coding Test

[Coding Test] 프로그래머스 Lv1. 같은 숫자는 싫어

by pearhyunjin 2024. 4. 9.

 

 

프로그래머스 Lv1 중 서치 없이 푸는데 실패한 문제를 정리한 내용입니다.

정리 내용 출처는 아래를 참고해 주세요.

 


 

문제 설명

 

각 원소가 숫자 0부터 9까지로 이루어진 배열 arr가 주어진다.

이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 한다.

단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 한다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성하라.

 

 

제한사항

 

-) 배열 arr의 크기 : 1,000,000 이하의 자연수

-) 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

 

 

입출력 예
arr answer
[1, 1, 3, 3, 0, 1, 1] [1, 3, 0, 1]
[4, 4, 4, 3, 3] [4, 3]

 

 

 

방식 해설

 

스택을 이용해 풀어보았다.

스택이 비어있거나 하나를 뽑았을때(제일 나중에 들어간 것)의 값이 arr 원소값과 같지 않은 경우

즉, 중복한 값이 연속적으로 나온것이 아닌 경우 스택에 추가한다.

해당 스택의 값을 차례대로 배열에 넣어준다. 이때 스택으로 입력, 출력하면 순서가 뒤바뀌게 되는데

순서가 일정해야 한다고 제한되어있기 때문에 순서를 바꿔준다.

 

class Solution {
    public static void main(String[] args) {
    	System.out.println(solution(new int[]{1, 1, 3, 3, 0, 1, 1})); //[1, 3, 0, 1]
        System.out.println(solution(new int[]{4, 4, 4, 3, 3})); // [4, 3]
    }
    
    public int[] solution(int []arr) {
        Stack<Integer> stack = new Stack<>();
        
        for (int num : arr) {
            if (stack.isEmpty() || stack.peek() != num) {
                stack.push(num);
            }
        }
        
        int[] answer = new int[stack.size()];
        
        for (int i = stack.size() - 1; i >= 0; i--) {
            answer[i] = stack.pop();
        }
        
        return answer;
    }