https://school.programmers.co.kr/learn/courses/30/lessons/42883
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명을 제대로 안 봐서 당했던 문제.
가장 큰 수 문제가 떠올라서 날먹 문제라고 생각했다.
중요한 건 이 문제에선 수의 순서를 바꾸면 안 된다는 것.
자 그럼 어떻게 해결해야 할까?
- 수의 순서를 바꿀 수 없다
- 달리 말하면 바꿀 필요가 없으니 편하다는 의미기도 하다. - 순서를 바꿀 수 없으니 그냥 앞에서부터 비교한다
- ``k``개의 숫자를 원본 수에서 제거해야 한다
- 몇 개의 숫자를 제거했는지 카운트하는 변수를 둔다. - 한 개의 수를 그때그때 비교하려면?
- ``STACK`` 등장.
function solution(number, k) {
let stack = [];
for (let num of number) {
// k가 남아있고, 스택에 원소가 있고, 스택 끝의 원소가 num보다 작을 때
while (k > 0 && stack.length > 0 && stack[stack.length - 1] < num) {
stack.pop();
k--;
}
stack.push(num);
}
// 만약 k가 남아있다면 뒤에서부터 제거
while (k > 0) {
stack.pop();
k--;
}
return stack.join('');
}
스택에 하나씩 넣으면서 다음에 오는 수와 비교한다.
크면 빼지 않고 그냥 둔다.
작으면 방 빼야지.
그걸 다 하고도 ``k``가 0이 아니면 그냥 뒤에서부터 ``pop``한다.
그리고 다 쪼개져있으니 ``join('')``으로 합쳐준다.
심플하지 않은가?
스택이 참 기똥찬 물건인 것 같다.
'Camp > T.I.L.' 카테고리의 다른 글
[TIL #23] Product Price at a Given Date (0) | 2024.10.10 |
---|---|
[TIL #22] 실시간으로 달리는 공룡 (0) | 2024.10.07 |
[TIL #20] 쿼드압축 후 개수 세기 (0) | 2024.10.02 |
[TIL #19] 다리를 지나는 트럭 (0) | 2024.10.01 |
[TIL #18] 2개 이하로 다른 비트 (0) | 2024.09.30 |