개발하는 사막여우
개발하는 사막여우
개발하는 사막여우
전체 방문자
오늘
어제
  • All (310)
    • 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.. (12)
      • Cozubi (6)
      • lol-chess (0)

블로그 메뉴

  • Github

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
개발하는 사막여우

개발하는 사막여우

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

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

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

문제주소 :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
    개발하는 사막여우
    개발하는 사막여우
    개발개발 주저리주저리

    티스토리툴바