코딩테스트
[JS] 큰 수 만들기
미안하다 강림이 좀 늦었다
2024. 3. 27. 18:27
난이도: Lv. 2
정답률: 51%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/42883
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
알고리즘
주어진 문자열에 있는 숫자들을 차례로 스택에 넣는다. 문자열을 모두 순회했거나 k번만큼 제거했다면 반복문을 멈춘다.
- (스택의 맨 위에 있는 숫자 < 넣을 숫자) 이면 넣지 않고 스택을 pop() 한다.
- 위의 경우가 아니라면 스택에 넣는다.
위의 반복문을 실행하고 나면 두 가지 경우가 있다.
- 덜 제거했는데 문자열을 모두 순회한 경우
- k번만큼 숫자를 제거한 경우
1. 의 경우 스택에 있는 원소들을 앞에서부터 (number.length - k) 개를 모은 문자열이 정답이다.
2. 의 경우 스택에 있는 원소들을 모두 담고, 아직 순회하지 않은 숫자들을 모두 담으면 정답이다.
코드
function solution(number, k) {
let answer = '';
let removeCount = 0;
let numberIdx = 0;
const stack = [];
while (removeCount < k && numberIdx < number.length) {
if (stack.length && stack[stack.length - 1] < number[numberIdx]) {
stack.pop();
removeCount++;
} else {
stack.push(number[numberIdx++]);
}
}
if (removeCount < k) {
for (let i = 0; i < number.length - k; i++)
answer += stack[i];
} else {
for (let num of stack) { answer += num; }
answer += number.substring(numberIdx);
}
return answer;
}
주저리
그리디로 분류돼 있길래 어떻게 그리디로 풀지 한참 진짜 한참을 고전했는데 스택으로 푸는 문제였다. 아 뭐 그리디도 틀린 말은 아닌데 그래도 이건 너무 하잖아~~~~~~~~~~~