문제 설명
주어진 자연수들의 배열을 입력받아서, 스택을 이용하여 오름차순으로 정렬된 수열을 만들어내는 문제입니다.
자연수 배열은 1 이상 1000 이하의 정수로 구성되며, 각 자연수는 중복되지 않습니다.
또한, 스택을 이용해서만 수열을 구성해야 하며 다음과 같은 조건을 만족해야 합니다.
- 모든 자연수는 한 번만 사용할 수 있다.
- 전달받은 자연수들을 스택에 넣고, 수를 꺼내는 방식으로 오름차순 정렬을 해야 한다.
- 수열을 만들 때, 연산 중간에 스택의 상태를 출력해야 한다.
입력 예시
5
3
2
4
1
출력 예시
1
2
3
4
5
문제 풀이 과정
이 문제를 해결하기 위해서는 스택의 LIFO(Last-In-First-Out) 특성을 활용해야 합니다.
스택의 기본 연산인 푸시(push)와 팝(pop) 연산을 통해, 주어진 수들을 오름차순으로 정렬된 수열을 만들 수 있어야 합니다.
1단계: 문제 분석
문제를 해결하기 위해서는 먼저 주어진 자연수들을 스택에 넣고, 적절하게 꺼내어 주어진 수열을 출력해야 합니다.
구체적으로, 가장 작은 수부터 순차적으로 출력하기 위해 스택을 조작하는 방식에 대해 고민해야 합니다.
즉, 스택에 숫자를 푸시하면서 현재 스택의 맨 위 차례와 나중에 출력해야 할 숫자를 비교하여 적절하게 꺼내오면 됩니다.
2단계: 알고리즘 설계
다음 알고리즘은 스택을 활용해 주어진 수열을 오름차순으로 출력하기 위한 단계별 과정입니다.
- 입력된 자연수를 순차적으로 읽어들인다.
- 읽은 수를 스택에 추가한다.
- 현재까지의 최소값을 확인하고, 스택의 맨 위 숫자가 이 최소값과 같으면 팝 연산을 수행하면서 출력한다.
- 위 과정을 모든 입력수가 처리될 때까지 반복한다.
3단계: 자바스크립트 코드 구현
function createSortedSequence(arr) {
// 스택 초기화
const stack = [];
const result = [];
// 다음에 출력할 숫자 초기화
let next = 1;
// 주어진 배열을 반복합니다.
for (let i = 0; i < arr.length; i++) {
// 현재 수를 스택에 푸시
stack.push(arr[i]);
// 현재 스택의 가장 위 숫자가 next와 같은 경우 팝
while (stack.length > 0 && stack[stack.length - 1] === next) {
result.push(stack.pop());
next++;
}
}
// 결과 반환
return result;
}
const inputArray = [3, 2, 4, 1, 5];
console.log(createSortedSequence(inputArray));
4단계: 코드 설명
위 코드에서 createSortedSequence
함수는 입력으로 자연수를 담고 있는 배열을 받습니다.
스택을 초기화하고, 어떤 수를 출력해야 할지 결정하기 위해 next
변수를 사용합니다.
그 다음으로 주어진 숫자 배열을 스택에 푸시하고, 스택의 맨 위 숫자가 next
와 비교하여 같을 경우
pop
하여 결과 배열에 추가합니다. 이 과정을 계속 반복하여 오름차순으로 정렬된 배열을 얻습니다.
5단계: 테스트 결과
코드를 실행하면以下과 같은 결과가 나옵니다.
[1, 2, 3, 4, 5]
6단계: 결론
이 문제를 통해 스택의 기본적인 사용법을 익힐 수 있었으며, 어떻게 스택의 특성을 활용하여 주어진 수를 정렬할 수 있는지 배웠습니다.
또한, 알고리즘 문제를 푸는 데 있어 문제 해석에서부터 알고리즘 설계, 코드 구현, 그리고 테스트까지의 전 과정을 체계적으로 진행할 수 있었습니다.
이러한 문제를 해결하는 과정은 알고리즘 면접 준비뿐만 아니라 실제 사용하는 프로그램에서도 매우 유용합니다.
추가 학습 자료
스택 구조에 대한 더 깊은 이해를 위해 다음 자료를 참고하는 것을 추천합니다:
자주 묻는 질문
Q: 스택을 사용하지 않고 문제를 해결할 수는 없나요?
A: 스택의 특성을 활용해야 하는 문제이므로, 스택을 사용하지 않으면 문제의 요구사항을 만족할 수 없습니다.
Q: 입력이 매우 큰 배열일 경우 성능에 문제가 생기지 않나요?
A: 이 알고리즘은 O(n) 시간 복잡도를 가지므로 효율적으로 작동합니다. 하지만 배열의 크기에 따라 메모리 사용량은 늘어날 수 있습니다.