문제 이해
배열에서 연속된 같은 숫자를 제거하여 하나만 남기는 문제입니다.
예시:
- 입력: [1,1,3,3,0,1,1]
- 출력: [1,3,0,1]
접근 방법
왜 스택을 사용하는가?
이 문제의 핵심은 가장 최근에 추가된 원소와 현재 원소를 비교하는 것입니다.
- 스택의 top에 있는 값과 현재 값을 비교 (O(1))
- 연속된 같은 숫자를 효율적으로 제거 가능
- LIFO(Last In First Out) 특성이 문제와 딱 맞음
알고리즘 설계
- 스택을 생성합니다
- 배열을 순회하며 각 원소에 대해:
- 스택이 비어있거나 top과 현재 원소가 다르면 → push
- 같으면 → 무시 (아무것도 하지 않음)
- 최종 스택을 배열로 변환하여 반환
구현 과정
초기 아이디어의 오류
처음에는 "같으면 기존 것을 빼고 새로운 것을 추가"하는 방식을 생각했습니다:
if (stack.isEmpty() || stack.peek() != num) {
stack.push(num);
} else {
stack.pop(); // 불필요한 연산
stack.push(num);
}
하지만 이는 불필요한 연산입니다. 같은 값을 빼고 다시 넣는 것보다 아무것도 하지 않는 것이 더 효율적입니다.
최종 해결책
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
Stack<Integer> stack = new Stack<>();
for (int num : arr) {
// 스택이 비어있거나 top과 현재 숫자가 다르면 추가
if (stack.isEmpty() || stack.peek() != num) {
stack.push(num);
}
// 같으면 아무것도 안함 (연속된 같은 숫자 무시)
}
return stack.stream().mapToInt(i -> i).toArray();
}
}
동작 과정 시뮬레이션
입력: [1,1,3,3,0,1,1]
1: [] → push(1) → [1]
1: top(1)==1 → 무시 → [1]
3: top(1)≠3 → push(3) → [1,3]
3: top(3)==3 → 무시 → [1,3]
0: top(3)≠0 → push(0) → [1,3,0]
1: top(0)≠1 → push(1) → [1,3,0,1]
1: top(1)==1 → 무시 → [1,3,0,1]
결과: [1,3,0,1]
핵심 포인트
- 스택의 특성 활용: 가장 최근 원소와의 비교가 핵심
- 간단한 조건문: 다르면 추가, 같으면 무시
- 효율성: O(n) 시간복잡도로 한 번의 순회만 필요
'Java > 알고리즘' 카테고리의 다른 글
| 스텍 / 큐 : 올바른 괄호 (1) | 2025.07.07 |
|---|---|
| 스텍 / 큐 : 기능개발 (0) | 2025.07.03 |
| 스텍 / 큐 : 프로세스 (1) | 2025.07.03 |
| 스텍 / 큐 : 다리를 지나는 트럭 (1) | 2025.07.03 |
| 스텍 / 큐 : 주식가격 (0) | 2025.07.03 |