일자: 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
괜... 찮아....
나도 계속 연습 하다보면 늘거야.... !!
반응형
'IT Study > 코딩테스트 by Python' 카테고리의 다른 글
[Programmers로 코딩테스트 준비] 조이스틱 - Lv.2_Day2👎🏻 (0) | 2024.08.31 |
---|---|
Programmers로 코딩테스트 준비하기 Day1 (0) | 2024.08.27 |
[Python] groupby, aggregate, pivot_table (0) | 2023.11.17 |
[Python] 고급함수 lambda, map, filter (0) | 2023.11.17 |
[이것이코딩테스트다/이코테] CH7 이진탐색 python (+연습문제, 예시답안) (0) | 2023.08.10 |