AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • OpenCV
  • 프로그래머스
  • 파이썬
  • 알고리즘
  • 이코테
  • level1
  • 연습문제
  • Python
  • 백준
  • LEVEL2

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

알고리즘/프로그래머스

[탐욕법] 큰 수 만들기 - Level 2

2022. 2. 6. 16:21
 

코딩테스트 연습 - 큰 수 만들기

 

programmers.co.kr

 

문제 설명

어떤 숫자에서 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"

 

 


✔ Solution

def solution(number, k):
    num_array = []  # 숫자를 모아서 큰 수를 만들 때 쓰일 배열

    # k개 만큼의 숫자를 빼냈을 때, i의 인덱스를 기억하기 위해서 i를 사용
    for i, num in enumerate(number):
        while len(num_array) > 0 and num_array[-1] < num and k > 0:
            num_array.pop()  # 리스트이 맨 끝에 있는 원소 하나를 없앤다.
            k -= 1


        #  더이상 뺄게 없으면 남은 거 전부 추가
        if k == 0:
            num_array += list(number[i:])
            break

        num_array.append(num)
     # 만약 빼지 못했으면 삭제 아니면 그대로
    num_array = num_array[:-k] if k > 0 else num_array

    answer = ''.join(num_array)
    return answer

 

⭐ 문제 포인트

 

앞에서부터 수들을 탐색하여 만약 탐색했던 수 보다 큰 수가 나올 경우 이전에 탐색된 수들을 제거

 

  1. 이전에 탐색했던 수들을 array에 저장
  2. 현재 탐색 중인 수와 array에 저장되어 있는 수들을 비교
    -  만약 스택에 저장된 수가 더 작을 시 제거, 동시에 k를 1씩 감소
    -  더 이상 제거할 수가 없을 때 현재 탐색 중인 수를 저장
  3. k가 0이 될 경우 array에 저장된 수 + 탐색할 남은 수들이 가장 큰 수
  4. k가 0이 아닌 상태로 탐색이 끝날 경우 array에 저장된 수의 뒤에서부터 k개 만큼 제거하면 가장 큰 수
  5.  join() 함수를 통해 가장 큰 수로 기록된 array을 문자열로 변경

 

✔ Solution 2 - 다른 사람 답

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

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 피보나치 수 - Level 2  (0) 2022.02.07
[2019 KAKAO BLIND] 무지의 먹방 - Level 4  (0) 2022.02.07
[스택/큐] 다리를 지나는 트럭 - Level 2  (0) 2022.02.06
[스택/큐] 프린터 - Level 2  (0) 2022.02.06
[스택/큐] 주식가격 - Level 2  (0) 2022.02.06
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바