250x250
vg-rlo
vg-rlo
vg-rlo
전체 방문자
오늘
어제
  • CATEGORY (114)
    • 일상과 기록 (12)
    • REVIEW (11)
    • DATA (20)
      • ML and DL (6)
      • NLP (2)
      • Growth hacking (2)
      • Note (10)
    • CODE (46)
      • Algorithm and Data Structur.. (2)
      • Coding Test (34)
      • DB (2)
      • Python (6)
      • Linux (2)
      • Github (0)
    • Portfolio (6)
      • Pratice and Tutorials (2)
      • Toy Projects (2)
      • Competitions (2)
      • Data Analysis (0)
    • ISSUE (17)
    • 🛠... (0)

블로그 메뉴

  • Github

인기 글

티스토리

hELLO · Designed By 정상우.
vg-rlo

vg-rlo

CODE/Coding Test

[Programmers] 탐욕법(Greedy) - 큰 수 만들기

2021. 12. 27. 22:22

문제 설명

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

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

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

제한 조건

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

입출력 예

number k return
"1924" 2 "94"
"1231234" 3 "3234"
"4177252841" 4 "775841"

 

성공 코드

참고 코드:  https://velog.io/@soo5717/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B0-%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC
실패 코드: https://vg-rlo.tistory.com/95

실패 코드와 참고 코드를 따라가보면서 이해했습니다. 실패 코드에서 생각한 접근 방식이 맞았으나, 구현하는 방식을 stack으로 하지 않고, 슬라이싱을 하면서 런타임 에러가 발생했습니다. 그리고 비교하더라도 같은 숫자만 반복되는 경우에 대해 고려해주지 않았기 때문에 에러가 발생했는데 이 부분도 참고 코드를 통해 해결할 수 있었습니다.

def solution(number, k):
    del_cnt = 0
    biggest_num = []
    for num in number:
        # 가장 큰 수 리스트가 비어있는 경우 
        if len(biggest_num) == 0:
            biggest_num.append(num)
        # 가장 큰 수 리스트가 비어있지 않은 경우
        else:
            if del_cnt < k:
                while True:
                    # 현재의 수가 앞자리 수보다 같거나 작으면 break
                    if num <= biggest_num[-1]:
                        break
                    # 앞자리 수를 제거
                    biggest_num.pop()
                    del_cnt += 1
                    # 가장 큰 수 리스트가 비어있거나 제거 횟수를 모두 채웠으면 break
                    if (len(biggest_num) == 0) or del_cnt == k:
                        break
            biggest_num.append(num)       
    # 제거 횟수를 다 채우지 않은 경우 슬라이싱(테스트케이스 12번: 같은 숫자로 반복되는 경우)
    biggest_num = biggest_num[:-k] if del_cnt < k else biggest_num
    return ''.join(biggest_num)

 

실행시간

정확성 테스트

테스트 1 〉 통과 (0.01ms, 10.3MB)
테스트 2 〉 통과 (0.01ms, 10.4MB)
테스트 3 〉 통과 (0.04ms, 10.3MB)
테스트 4 〉 통과 (0.21ms, 10.3MB)
테스트 5 〉 통과 (0.22ms, 10.3MB)
테스트 6 〉 통과 (3.75ms, 10.4MB)
테스트 7 〉 통과 (9.59ms, 10.7MB)
테스트 8 〉 통과 (23.08ms, 10.8MB)
테스트 9 〉 통과 (39.35ms, 13.7MB)
테스트 10 〉 통과 (133.79ms, 13.4MB)
테스트 11 〉 통과 (0.01ms, 10.2MB)
테스트 12 〉 통과 (0.01ms, 10.3MB)
저작자표시 비영리 변경금지 (새창열림)
    'CODE/Coding Test' 카테고리의 다른 글
    • [Programmers] 깊이/너비우선탐색(DFS/BFS) - 단어 변환
    • [Programmers] 힙(heap) - 디스크 컨트롤러
    • [Programmers] 탐욕법(Greedy) - 구명보트
    • [Programmers] 그래프(Graph) - 가장 먼 노드
    vg-rlo
    vg-rlo
    🛠블로그 공사중.. Keep going! 🤔 (Profile - Dinotaeng®)

    티스토리툴바