본문 바로가기

Algorithm (Java)/문제풀이

[자바/java] 프로그래머스 - 같은숫자는 싫어 (Level1 - Stack)

유형: Stack  (또는 ArrayList)

 

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

 

 

프로그래머스

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

programmers.co.kr

 

문제 설명

배열 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 하는 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]
입출력 예 설명

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

 

 

문제풀이

  • integer형 stack 선언
  •  전달받은 배열(arr)만큼 반복문을 돌면서 우선, arr[0]값을 stack에 삽입
  • 인덱스 1부터는, stack의 최상단의 값(peek)이 arr[i]의 값과 일치여부 확인  후 일치하지 않을 경우에만 stack에 해당 값 push
  •  결과값 answer의 사이즈는 stack의 사이즈와 동일하게 생성
  •  stack의 사이즈만큼 반복문을 돌면서 stack에서 꺼낸 값 pop하여 차곡차곡 담되,
  • stack에서 꺼내는 값은 LIFO로 실제 배열의 역순이므로 역순으로 담는다 (i는 st.size()-1부터 시작, -1씩 줄여가며 i가 0보다 크거다 같은동안)

 

구현코드

import java.util.*;

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

        
        //integer를 담는 Stack 선언
        Stack<Integer> st = new Stack<Integer>();
        
        // 전달받은 배열만큼 반복문을 돌면서
        for(int i=0; i<arr.length; i++){
        
        	// 우선, 배열 첫 번째 숫자를 stack에 삽입
            if(i==0) st.push(arr[i]);
           	// 인덱스 1부터는, stack의 최상단의 값(peek)이 arr[i]의 값과 일치여부 확인 후
            // 일치하지 않을 경우에만 stack에 해당 값 push
            else if(st.peek() !=arr[i]) st.push(arr[i]);
    
        }
        
      	// 결과값 answer의 사이즈는 stack의 사이즈와 동일하게 생성
        answer = new int[st.size()];
		// **stack의 사이즈만큼 반복문을 돌면서 
        // stack에서 꺼낸 값 pop하여 차곡차곡 담되,
        // stack에서 꺼내는 값은 LIFO로 실제 배열의 역순이므로
        // 역순으로 담는다 (i는 st.size()-1부터 시작, -1씩 줄여가며 i가 0보다 클때까지)
        for(int i=st.size()-1; i >= 0;i--){
            answer[i] = st.pop();
        }
        
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("Hello Java");

        return answer;
    }
}

 

소회

1. stack 자료구조를 활용해서 코드를 구현해본 적이 없어서 stack구조는 어디서 쓰이나 궁금했는데 이번 문제를 계기로 이해하게 되었음

2. array과 stack을 함께 쓰면서, stack은 LIFO구조로 값을 넣고 꺼내기 때문에 처음 array에 담겨있던 순으로 stack에서 값을 꺼내 다시 담으려면, stack에서 꺼낸 값들을 arr의 인덱스에 역순으로 넣는 것이 포인트였던 것 같다