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

YuJangHoon·2022년 3월 5일
0
post-thumbnail

💡 문제 해결 아이디어

✨ 재시도에 작성한 알고리즘

  • 높은 자릿수의(앞쪽의) 숫자가 커져야 수가 가장 커지기 때문에, 앞에서부터 최대한 큰 수만을 남기는 방식으로 진행한다. stack으로 구현한다.
  • k는 남은, 제거할 수 있는 기회
  • stack = []
  • for 숫자 in 문자열:
    • 제거할 기회가 남아있고, stack에 무엇인가 존재하고, "숫자"보다 stack의 마지막 수가 작으면,
      • stack에서 pop(제거)을 하고, k -= 1 (제거할 기회 -= 1)
    • stack에 "숫자"를 append
  • stack에 있는 숫자들을 join하고 n-k번째까지 잘라낸다. (혹여나 제거할 기회가 남아있는 경우, 끝의 k개를 잘라내게 된다. 여기서 n은 문자열의 길이. 그냥 -k로 할 경우 k가 0일때 문제가 된다)

내가 생각한 아이디어:

- 제거할 숫자를 고르는 것이 아니라 뽑을 숫자를 고르는 방향으로 선택
- 앞에서부터 뽑아야할 총 글자수만큼의 후보 중에서 max를 선택하고, 그 뒤부터 다시 후보로 선택하는 과정을 반복하는.

🛠 답안 아이디어(피드백)

- stack을 활용한다. (list)
- 숫자를 하나씩 확인하면서, 
	- 비교대상(stack의 마지막 숫자)이 없다면 append, 
    - 비교대상이 자신보다 작으면 제거하고(pop) 아니면 그냥 append, 작더라도 더 제거할 여력이 없다면 (k=0) 제거하지 않는다.
- 그렇게 끝났는데도 제거할 게 남아있다면 (k>0), stack에서 뒤에서부터 남은 수 (k)만큼 제거한다.

💻 재시도에 작성한 코드

def solution(number, k):
    n = len(number)
    stack = []
    for num in number:
        while k > 0 and stack and num > stack[-1]:
            stack.pop()
            k -= 1
        stack.append(num)
    return "".join(stack)[:n-k]
profile
HYU DataScience, ML Engineer - 산업기능요원(4급)

0개의 댓글