[프로그래머스] 큰 수 만들기 / Python

2021. 1. 16. 21:36·Programmers
반응형

문제주소 :programmers.co.kr/learn/courses/30/lessons/42883#

 

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

 

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

<풀이법>

▒ 한줄 개념: 탐욕법 *▒ *

이 문제의 핵심은 탐욕법입니다. 현재 상황에서 가장 좋은 값을 챙긴다는 뜻이죠.

이 문제의 해결 방향을 살펴보면 다음과 같습니다.

number = "4177252841"
k = 4

i = 0 -> number를 탐색하는 인덱스
checked = [] -> 스택 배열

문제의 3번째 예시를 이용해서 설명해보겠습니다.

여러가지 수들 중 가장 큰 수는 앞자리의 수가 큰 수가 됩니다.천 단위 숫자이면 천의 자리 수가, 백 단위의 숫자이면 백의 자리수가 가장 커야한다는 뜻입니다.탐욕법을 이용해 이 풀이를 구현하는 방법은, number의 맨 앞부터 시작해서 한 글자 한 글자 탐색해나가며 큰 수들만 남기고 작은 수는 삭제하는 것입니다.

 

----시작(i =0)----
k = 4
number[i] =  4
checked = []

changed_checked = ['4']

처음 탐색을 시작하면 상태는 위와 같습니다. checked에 어떤 값도 없으니 일단 0번째 숫자인 4를 넣습니다.

 

---- i = 1 ----
k = 4
number[i] =  1
checked = ['4']

changed_checked = ['4', '1']

현재 checked엔 4가 들어가있고, 이번에 가져온 숫자는 1입니다. 1과 checked의 맨 뒤 숫자인 4를 비교하면, 4가 더 큽니다. 따라서 1을 그냥 넣습니다.

 

---- i = 2 ----
k = 4
number[i] = 7
checked = ['4', '1']

changed_checked = ['4']

현재 checked엔 4,1이 들어가있고, 이번에 가져온 숫자는 7입니다. 

7과 checked의 맨 뒤 숫자인 1을 비교합니다. 7이 더 큽니다. 그럼 1은 pop됩니다. 

숫자 하나가 삭제되었으니, k값이 1 감소합니다.

 

---- i = 2 ----
k = 3
number[i] =  7
checked = ['4']

changed_checked = []

1이 pop 됐으니, checked엔 4만 남았습니다. 이번엔 4를 7과 비교합니다. 마찬가지로 7이 더 크니, 4 또한 pop 됩니다. 

숫자가 또 삭제되었으니, k값이 또 1 감소합니다.

 

---- i = 2 ----
k = 2
number[i] =  7
checked = []

changed_checked = ['7']

이제 checked는 비었습니다. 따라서 7을 넣습니다. 

 

---- i = 3 ----
k = 2
number[i] =  7
checked = ['7']

changed_checked = ['7', '7']

다음으로 가져오는 수 또한 7입니다. 가져온 7은 checked에 저장된 맨 뒤 수인 7 보다 크지 않습니다. 따라서 그냥 넣어줍니다.

 

---- i = 4 ----
k = 2
number[i] = 2
checked = ['7', '7']

changed_checked = ['7', '7', '2']

이번에는 2를 가져옵니다. checked의 맨 뒤 숫자인 7보다 크지 않습니다. 넣어줍니다.

 

---- i = 5 ----
k = 2
number[i] = 5
checked = ['7', '7', '2']

changed_checked = ['7', '7']

이번에 가져온 숫자는 5입니다. 5는 checked의 맨 뒤인 2보다 큽니다. 따라서, 2를 checked에서 pop해줍니다.

숫자가 삭제되었으니, k값이 1 감소합니다.

 

---- i = 5 ----
k = 1
number[i] = 5
checked = ['7', '7']

changed_checked = ['7', '7', '5']

그 다음에 5가 비교할 값은 7입니다. 5는 7보다 크지 않습니다. 따라서 checked에 넣어줍니다.

 

---- i = 6 ----
k = 1
number[i] =  2
checked = ['7', '7', '5']

changed_checked = ['7', '7', '5', '2']

이번에 가져온 값은 2입니다. 비교할 값은 5인데, 2는 5보다 작습니다. 따라서 넣어줍니다.

 

---- i = 7 ----
k = 1
number[i] = 8
checked = ['7', '7', '5', '2']

changed_checked = ['7', '7', '5']

이번에는 8을 가져왔습니다. 8은 checked의 마지막 값, 2보다 큽니다. 따라서 2가 pop됩니다.

2가 삭제되면서, k는 1 감소합니다.

 

k = 0 
checked = ['7', '7', '5']
남은 number = ['8', '4', '1']

k가 0이 되었으니, 더 이상은 원소가 삭제되지 않습니다. 따라서 남은 모든 number를 checked에 붙여줍니다. 그럼 결과적으로 가장 큰 수가 나오는 것입니다.

 

<코드(Python)>

def solution(number, k):
    checked = []
    i = 0

    while i < len(number) and k > 0:
        if len(checked) != 0 and int(checked[-1]) < int(number[i]):
            checked.pop(-1)
            k -= 1
        else:
            checked.append(number[i])
            i += 1

    answer = "".join(checked) + number[i:]
    if k != 0:
        answer = answer[:-k]

    return answer

더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest

반응형

'Programmers' 카테고리의 다른 글

[프로그래머스] 오픈채팅방 / Python  (0) 2021.01.16
[프로그래머스] 최솟값 만들기 / Python  (0) 2021.01.16
[프로그래머스] 최댓값과 최솟값 / Python  (0) 2021.01.15
[프로그래머스] JadenCase 문자열 만들기 / Python  (0) 2021.01.15
[프로그래머스] 구명 보트 / Python  (0) 2021.01.15
'Programmers' 카테고리의 다른 글
  • [프로그래머스] 오픈채팅방 / Python
  • [프로그래머스] 최솟값 만들기 / Python
  • [프로그래머스] 최댓값과 최솟값 / Python
  • [프로그래머스] JadenCase 문자열 만들기 / Python
개발하는 사막여우
개발하는 사막여우
개발개발 주저리주저리
    반응형
  • 개발하는 사막여우
    개발하는 사막여우
    개발하는 사막여우
  • 전체
    오늘
    어제
    • All (311)
      • Books (13)
        • 읽기 좋은 코드가 좋은 코드다 (13)
      • Study (6)
        • Blockchain (3)
        • Algorithm (3)
      • Baekjoon (36)
      • Programmers (166)
      • LeetCode (15)
      • Open Source (1)
        • Youtube Popout Player (1)
      • Language (32)
        • Python (9)
        • JS (8)
        • Java (5)
        • HTML (6)
        • CSS (4)
      • Library & Framework (15)
        • React.js (15)
      • IDE (2)
        • IntelliJ (2)
      • Airdrop (9)
      • Tistory (2)
      • etc.. (7)
        • Cozubi (6)
        • lol-chess (0)
  • 블로그 메뉴

    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    신규 코인 에어드랍
    백준
    Python
    코딩테스트연습
    파이썬
    카카오 코딩테스트
    클린 코드
    카카오 공채
    클린 코드 작성법
    프로그래머스 위클리 챌린지
    코주비
    Cozubi
    2018 KAKAO BLIND RECRUITMENT
    프로그래머스
    코인줍줍
    programmers
    읽기 좋은 코드가 좋은 코드다
    카카오 알고리즘 문제
    알고리즘문제풀이
    Java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
개발하는 사막여우
[프로그래머스] 큰 수 만들기 / Python
상단으로

티스토리툴바