문제출처: https://programmers.co.kr/learn/courses/30/lessons/42883#
접근법
3. 하루정도 10번 테스트 케이스때문에 고생하다 스택을 활용해야 한다는 팁을 보고 코드를 작성 후 제일 효율적으로 보이는 코드를 참조하여 수정해보았다.
위의 접근법은 다음 숫자가 이전까지 나온 숫자들보다 클 시 횟수 k만큼은 제거할 수 있었다. 그리고 순차접근을 보장하고 스택구조를 활용하면 이전까지 나온 숫자들 중 마지막 숫자를 다음 숫자와 비교하여 제거할지 말지 쉽게 판단할 수 있었다.
코드
(오답코드 1) # def solution(number, k): # answer = '' # s = [] # for i in range( len(number) ): # if( i == len(number)-k ): # k -= 1 # continue # j = i + 1 # flag = True # while( j <= i+k and j < len(number) ): # if( number[j] > number[i] ): # flag = False # break # j += 1 # if( flag ): # s.append(number[i]) # else: # k -= 1 # answer = ''.join(s) # return answer (오답코드 2) # def solution(number, k): # answer = '' # i = 0 # while( i < len(number)-k ): # j = i+1 # m,index = "" , 0 # while( j <= i+k ): # if( m < number[j] ): # m = number[j] # index = j-i # j += 1 # answer += m # i += index + 1 # k -= index # return answer정답코드)
def solution(number, k): answer = '' s = [] for cur in number: while( k > 0 and s and s[-1] < cur ): s.pop() k -= 1 s.append(cur) answer = ''.join(s[:len(s)-k]) return answer