IT Study/코딩테스트 by Python

[Programmers로 코딩테스트 준비] 큰 수 만들기 - Lv.2_Day3

짹짹체유 2024. 8. 31. 13:23

일자: 2024년 08월 29-30일

알고리즘: 탐욕법

 

 

문제 설명

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.

문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.



제한 조건

  • number는 2자리 이상, 1,000,000자리 이하인 숫자입니다.
  • k는 1 이상 number의 자릿수 미만인 자연수입니다.

 

접근 방법

  • 가장 큰 수를 찾고 값 시작
  • final 리스트를 생성하고 가장 마지막에 있는 값보다 크면 기존 값 제거하고 새로 추가
def solution(number, k):
    num_cnt = abs(k - len(number))
    start = max(number[:num_cnt])
    start_index = number.index(start)
    final = []

    left_k = k - start_index
    lst = number[start_index+2:]
    final.append(start)
    final.append(number[start_index+1])

    for i in range(len(lst)):
        if (left_k == 0) or (len(lst[i:])-left_k+1==0):
            final.append(lst[i:])
            break
        if int(final[-1]) < int(lst[i]):
            left_k -= 1
            del final[-1]
        final.append(lst[i])
    final = ''.join(final)
    return final
  • 가장 큰 수를 찾고 해당 수(start)부터 값이 시작 -> 뒤에 남은 수들의 갯수를 파악 안했음

 

테스트 1
입력값 "1924", 2
기댓값 "94"
실행 결과 테스트를 통과하였습니다.
테스트 2
입력값 "1231234", 3
기댓값 "3234"
실행 결과 테스트를 통과하였습니다.
테스트 3
입력값 "4177252841", 4
기댓값 "775841"
실행 결과 테스트를 통과하였습니다.
테스트 4
입력값 "179252841", 6
기댓값 "984"
실행 결과 실행한 결괏값 "95841"이 기댓값 "984"과 다릅니다.

 

  • 오류점

- 바로 이전 숫자와만 비교가 딤

 

 

From Claude

def solution(number, k):
    stack = []
    for num in number:
        while k > 0 and stack and stack[-1] < num:
            stack.pop()
            k -= 1
        stack.append(num)
    
    if k != 0:
        stack = stack[:-k]
    
    return ''.join(stack)
  • 앞에서부터 제거해야하는 개수 만큼 차근차근 지워나간다면 뒤에 남은 갯수는 확인할 필요가 없음

 

 

Comment

괜... 찮아....

나도 계속 연습 하다보면 늘거야.... !!

 

반응형