자료구조 & 알고리즘/프로그래머스 (Java)

[프로그래머스] 같은 숫자는 싫어

오징어달료 2024. 9. 24. 00:59

스택 / 큐
난이도 : Lv.1

문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다.
예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3]을 return 합니다.

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

제한사항

  • 배열 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]

입출력 예 설명

입출력 예 #1,2
문제의 예시와 같습니다.


Solution

import java.util.*;

public class Solution{

	public int[] solution(int []arr){
    	int temp = 0
        Stack<Integer> stack = new Stack<>();
        
        // arr의 배열만큰 순환
        for(int i = 0; i < arr.length; i++){
        
        	if(i == 0){
	            // 첫번째는 무조건 넣을수 있도록
            	stack.push(arr[i]);
                
            }else if(stack.peek() != arr[i]){
            	// 스택의 최상단의 숫자와 같지 않을 경우 저장
                // 중복 제외
            	stack.push(arr[i]);
                
            }
      	}
        
        // 스택 사이즈 만큼 배열 생성 
        int[] answer = new int[stack.size()];
        
        // answer에 스택에 저장되어 있는 값 대입
        for(int j = 0; j < stack.size(); j++){
        	answer[j] = stack.get(j);
        }
     
     return answer;
    }
}

해설

중복된 숫자 처리와 저장되는 순서만 고려하면 풀수 있는 문제이다.
문제에 (1) 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거, (2) 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지
이 조건에 따라서 if을 통해 중복되는 숫자인지 체크를 하고 아니면 Stack 저장하도록 처리했다. 첫번째 숫자의 경우 비교할 대상이 없기에 처음에는 무조건 저장하도록 for문의 인덱스 0 번을 넣어 처리했다. 그 이후 int형 배열로 저장된 Stack의 배열만큼 선언해준 후 for문을 통해 Stack 값에 접근해 answer 배열에 값을 대입한 후 리턴하면 된다.

포인트

다른 방식을 이용해 풀수도 있지만 Stack의 특징인 LIFO를 이해하며 문제에 접근하면 좋을듯 하다.


스택 설명 링크

https://forcetyty.tistory.com/51

 

[자료구조] Stack

Stack Stack은 LIFO(Last In, First Out) 원칙을 따르는 자료구조즉, 마지막에 삽입된 데이터가 가장 먼저 제거되는 방식으로, 후입선출 이라고 함Java 에서는 Stack 클래스로 구현이 되어 있음.java.util.Stack

forcetyty.tistory.com


문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr