🧩 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12906
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 내가 작성한 코드
1. 연속된 요소 제거
- 문제의 핵심은 연속된 요소를 제거하는 것입니다.
- 스택은 LIFO(Last In, First Out) 구조로, 마지막으로 추가된 요소를 쉽게 제거할 수 있습니다.
import java.util.*;
public class Solution {
public int[] solution(int[] arr) {
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < arr.length; i++) {
stack.push(arr[i]);
if(stack.size() > 1 && stack.peek() == arr[i - 1]) {
stack.pop();
}
}
return stack.stream().mapToInt(i->i).toArray();
}
}
- 빈 Stack 선언
- `Stack`은 LIFO(Last In First Out) 구조를 가지며, 최근에 추가된 요소가 가장 먼저 제거됨
- 이를 통해 이전 요소와 현재 요소를 비교하면서 숫자가 중복되어 연속될 경우, 현재 요소를 쉽게 제거할 수 있음
- arr[] 배열을 반복문 돌면서 Stack 쌓기
- 배열의 각 요소를 차례대로 stack에 `push()`
- stack의 size가 1보다 크고, stack에서 꺼낸 마지막 요소가 arr[i-1] 값과 같을 경우 연속되는 숫자 제거
- 스택의 크기가 1보다 커야 이전 요소와 비교할 수 있으므로 `stack.size() > 1` 조건 설정
- 연속된 숫자가 스택에 추가되지 않도록 하기 위하여, 스택의 가장 위에 있는 요소와(`stack.peek()`) 이전 요소(`arr[i - 1]`)를 비교
- 두 값이 같다면 `pop()` 으로 해당 값 제거
- Stack<Integer>를 int[] 타입으로 변경 후 return
- stream(): 컬렉션의 요소들을 함수형 스타일로 처리 후
- mapToInt(i -> i): 스트림의 각 요소를 int로 변환
- toArray(): 스트림을 배열로 변환 후 return
🧠 배운 점
- 이 문제를 통해 연속된 요소를 처리할 때 스택의 LIFO 구조가 유용하게 쓰일 수 있다는 것을 알게 되었습니다.
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 자바(Java) - 가장 큰 수 (0) | 2024.07.05 |
---|---|
[프로그래머스] 자바(Java) - 더 맵게 (0) | 2024.07.02 |
[프로그래머스] 자바(Java) - 의상 (1) | 2024.06.30 |
[프로그래머스] 자바(Java) - n^2 배열 자르기 (0) | 2024.06.26 |
[프로그래머스] 자바(Java) - 할인 행사 (0) | 2024.06.24 |