Bibbidi Bobbidi Boo

* 알고리즘 너무 약해서 기초 문제 50개 목표로 푸는 중...

* 3시간 안에 답을 내지 못하면 답지를 보고 30분 내로 정답 판정을 받고, 3일 뒤 다시 풀어보기


Greedy

8 / 50(NEW!)

 

탐색

7/ 50

 

기초 동적 프로그래밍

6 / 50


투포인터

2 / 10

 

이분탐색

0 / 10


문제

백준 2812번: 크게 만들기 or 프로그래머스 Level 2: 큰 수 만들기

→ solved.ac 기준 골드 3

→ 프로그래머스에서 연습 문제 중 Greedy에 있는 문제


문제 해결 아이디어

숫자에서 k를 뺀 나머지 만큼의 모든 경우의 수를 구하기에는 n의 최댓값이 1,000,000

→ Greedy로 최적의 알고리즘을 생각해내야 한다.

→ 가장 큰 수가 되기 위해서는

큰 수 위주로 뽑되, 출력 예시 중 "4177252841"(k = 4)와 같은 경우를 고려하자.

가장 작은 것은 1이지만, 정답에서 마지막 1은 없어지지 않는다. 

큰 수 위주이되, 앞자리가 큰 수 인게 중요.

→ stack을 활용해서 큰 수만 담게 하자.

1. for문을 돌면서 number에 접근한다.

2. stack의 최상단이 현재 number보다 작으면 pop()한다.

3. stack에 값을 추가한다.

마지막으로 stack 에서 크기만큼 잘라서 업데이트 하면 끝.


구현

내 풀이

def solution(numbers, k):
    stack = []
    
    for n in numbers:
        while stack and stack[-1] < n and k > 0:
            stack.pop()
            k -= 1
        stack.append(n)
    
    return ''.join(stack[:len(stack)-k])

메모

  • 걸린 시간: 약 20분
    • 첫 번째 풀었을 때 해답 못 찾고 답지 보고,
    • 며칠 후 2차로 풀었을 때 20분 소요.
  • 프로그래머스 test case 12에서 조금 소요가 됐다.
    • 이는 반환 시에 stack에서 len(stack) - k만큼 잘라주지 않아서 그랬다.
  • 처음에 프로그래머스에서 풀고, 다음에 백준에서 그대로 옮겨서 해봤는데 불통했다.
    • 실수로 반환 시에 len(numbers) - k 만큼 잘라줘서 그랬다.
    • 프로그래머스에서 테스트케이스가 조금 부족한 듯.(질문하기에도 테케 추가해달라는 글이 있었다)

profile

Bibbidi Bobbidi Boo

@비비디

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!