프로그래머스 “같은 숫자는 싫어” 문제 해결과정입니다.
같은 숫자는 싫어
문제설명
배열 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] |
문제 해결과정
프로그래머스 코드
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
int[] answer = {};
Stack<Integer> stack = new Stack<>();
stack.push(arr[0]);
for(int arrs : arr) {
if(stack.peek() != arrs) {
stack.push(arrs);
}
}
answer = new int[stack.size()];
int k = stack.size() - 1;
while(!stack.isEmpty()){
answer[k--] = stack.pop();
}
return answer;
}
}
문제를 읽어보면 arr에서 연속적인 수가 나오면 추출하지 않고 앞 숫자와 중복되지 않았을 때 출력한다. 스택을 통해서 만약 스택의 peek에 arr의 값과 다른 값이 있다면 추가 하는 형식으로 할 건데 먼저 foreach문을 통해 arr의 요소들을 받는다. foreach를 통해 받은 arr의 요소들을 if문으로 체크하여 앞 수와 arrs가 다를 때만 스택에 넣어준다. 이후에 바로 스택으로 반환하려 하면 반환 값이 int[]라서 에러가 발생한다. 때문에 answer를 스택의 사이즈로 만들어준 뒤 while문을 통해 스택의 값이 없어질 때까지(!answer.isEmpty()) answer에 스택에 들어있던 값을 넣는다. while문이 종료되면 answer가 리턴된다.