[프로그래머스] 큰수 만들기

2025. 8. 14. 20:49·알고리즘/코딩테스트

number k (제거하려는수) return
"1924" 2 "94"
"1231234" 3 "3234"
"4177252841" 4 "775841"

다음문제는 k개를 제거후 가장큰숫자를 구해야하는 문제입니다.

 

제가 생각한 알고리즘은 작은 수를 제거하는 방식이 잘못되었었습니다.

 

const small = new Array(k).fill(Infinity); // 삭제하려는 값을 배열로 관리

for (const num of nums) {
    for (let i = 0; i < k; i++) {
        if (small[i] > num) { // 삭제값 > 숫자
            small[i] = num; // 값 치환
            break;
        }
    }
}

 

  • k개의 가장 작은 숫자를 골라 small 배열에 저장한 후 제거하려는 방식.
  • 문제는 숫자의 위치(순서)가 중요하다는 것!
    예: 4177252841에서 4와 1이 가장 작다고 해도 무작정 제거하면 안 됩니다.
    앞쪽에서 제거하는 것이 결과에 큰 영향을 미침

 

이문제는 그리디알고리즘을 활용해서 풀면 풀립니다.

즉, 앞에서부터 숫자를 보면서, 앞 숫자가 뒤 숫자보다 작으면 제거해야 가장 큰 숫자가 나옵니다.

 

 

앞자리수가 stack의 가장 아래에있는 값이여서 자리수를 유지하면서 작은값들은 pop으로 stack에서 제거할수있습니다.

결국 stack에 남아있는 값들은 최대값이 됩니다.

 

 

function solution(number, k) {
    const stack = [];
    
    for (let i = 0; i < number.length; i++) {
        const current = number[i];

        while (k > 0 && stack.length > 0 && stack[stack.length - 1] < current) {
            stack.pop();
            k--;
        }

        stack.push(current);
    }

    // 아직 제거할 숫자가 남아 있다면, 뒤에서 제거
    return stack.slice(0, stack.length - k).join('');
}

 

while문을 사용해서 stack을 연속으로 제거하는 이유는 왜일까요?

 

맨앞자리의 가장큰수를 만족하는 이유이기때문입니다.

그렇지만 최대 k개까지 제거를 감안하여 k값을 pop할때 -로 관리해줍니다.

 

 

특정 문자열에서 최대값을 만드는 문제에 그리디 알고리즘을 적용한 사례입니다.
항상 최적의 결과를 기대하며, 그리디 알고리즘을 스택에 접목해 구현한 예시입니다.

 

k 값과 while 조건의 세부 조절이 필요하긴 하지만,
전체 숫자를 한 번만 순회하는 단일 for문으로 구현되어 시간복잡도는 O(N)이며,
스택을 활용해 숫자 관리가 매우 깔끔해집니다.

이 과정을 통해 그리디 알고리즘의 효율적이고 혁신적인 문제 해결 방식을 깨닫는 좋은 경험이었습니다.

'알고리즘 > 코딩테스트' 카테고리의 다른 글

[leetcode] 451. 빈도순으로 문자 정렬  (0) 2025.10.15
[dfs 기본 문제] dfs 로 모든경우의 수 + - 로 더하기  (2) 2025.08.25
코딩 테스트를 준비하기 전에  (5) 2025.07.27
[프로그래머스] 이진 변환 반복하기  (2) 2025.07.25
[leetcode] 11. Container With Most Water  (0) 2025.05.07
'알고리즘/코딩테스트' 카테고리의 다른 글
  • [leetcode] 451. 빈도순으로 문자 정렬
  • [dfs 기본 문제] dfs 로 모든경우의 수 + - 로 더하기
  • 코딩 테스트를 준비하기 전에
  • [프로그래머스] 이진 변환 반복하기
윤랩용
윤랩용
정리하고 내것으로만들기
  • 윤랩용
    yunrap 개발블로그
    윤랩용
  • 전체
    오늘
    어제
    • 분류 전체보기 (104)
      • 알고리즘 (17)
        • 알고리즘유형 (5)
        • 코딩테스트 (7)
      • 네트워크 (3)
      • 언어 (14)
        • HTML (0)
        • CSS (1)
        • Javascript (9)
        • Java (1)
        • 용어 (3)
      • Backend (1)
        • Spring (1)
      • FrontEnd (12)
        • React (9)
        • Next.js (0)
        • 성능 및 전략 (1)
        • LAB(실험실) (1)
      • 프로젝트 (1)
      • 자기개발 (2)
        • motivation (1)
      • STUDY (45)
        • 모던자바스크립트 DeepDive (22)
        • 인사이드 자바스크립트 (2)
        • CS 기술 면접스터디 (10)
      • 요즘 FE TREND 뭘까? (1)
  • 공지사항

    • 블로그를 새롭게 활성화시키겠습니다.
  • 최근 글

  • 인기 글

  • 태그

    목표완수
    create react app
    __proto__
    해쉬맵 0(1)
    유사배열객체 배열 변환
    dom 노드 배열변환
    클로저
    iterator 배열변환
    원시타입
    접근자프로퍼티
    커뮤니티기반
    Map 배열변환
    map.entries()
    즉시실행함수
    코딩하기전설계
    var키워드
    온루틴
    Set 배열변환
    이터레이터객체
    캡슐화
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
윤랩용
[프로그래머스] 큰수 만들기
상단으로

티스토리툴바