⌨️ Algorithms/프로그래머스
[Python] 프로그래머스 Lv2_큰 수 만들기
monzheld
2023. 1. 26. 00:22
https://school.programmers.co.kr/learn/courses/30/lessons/42883
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자 구하기
- ex) 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있음
- 이 중 가장 큰 숫자는 94
- number: 문자열 형식인 숫자
- k: 제거할 수의 개수
- number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return
제한 조건
- number는 2자리 이상, 1,000,000자리 이하인 숫자
- k는 1 이상 number의 자릿수 미만인 자연수
"""
입출력 예시)
number = "1924", k = 2 -> "94"
number = "1231234", k = 3 -> "3234"
number = "4177252841", k = 4 -> "775841"
"""
## 의사코드 ##
# number에서 k개의 수를 제거했을 때 나올 수 있는 경우 구하기
# combinations(number, len(number)-k))
# combinations로 구한 값들 중 max()를 문자열 형태로 return
첫 번째 시도
from itertools import combinations
def solution(number, k):
numbers = list(map(int, number))
# number에서 k개의 수를 제거했을 때 만들 수 있는 조합
combi = list(combinations(numbers, len(number)-k))
max_n = map(str, max(combi))
return ''.join(max_n)
-> combinations로 조합 구현
-> 추가 테스트 케이스 실패 (시간 초과)
두 번째 시도
def solution(number, k):
numbers = list(number)
n = len(numbers)
r = len(number) - k # number에서 k개의 수를 제거한 숫자의 길이
combi = [] # number에서 k개의 수를 제거했을 때 만들 수 있는 조합
# DFS 수행
def dfs(idx, li):
if len(li) == r:
combi.append(li[:])
return
for i in range(idx, n):
dfs(i+1, li+[numbers[i]])
dfs(0, [])
return ''.join(max(combi))
-> DFS로 조합 구현
-> 추가 테스트 케이스 실패 (시간 초과, 런타임 에러)
통과한 코드
def solution(number, k):
stack = []
for num in number:
if len(stack) == 0:
stack.append(num)
continue
if k > 0:
while stack[-1] < num:
stack.pop() # stack[-1]을 꺼냄
k -= 1
if len(stack) == 0 or k <= 0:
break
stack.append(num)
stack = stack[:-k] if k > 0 else stack
return ''.join(stack)
-> stack 활용, 앞자리에 큰 숫자가 와야 전체 수를 크게 만들 수 있다는 점 활용
- 과정 확인
number = "1231234"
k = 3
"""
k = 3일 때
num: 1
stack: ['1']
num: 2
k: 3
stack: ['1']
stack[-1]: 1
stack[-1](=1) vs num(=2)
stack[-1] < num 인 경우
pop한 stack: []
k: 2
stack.append(num): ['2']
num: 3
k: 2
stack: ['2']
stack[-1]: 2
stack[-1](=2) vs num(=3)
stack[-1] < num 인 경우
pop한 stack: []
k: 1
stack.append(num): ['3']
num: 1
k: 1
stack: ['3']
stack[-1]: 3
stack[-1](=3) vs num(=1)
k: 1
stack.append(num): ['3', '1']
num: 2
k: 1
stack: ['3', '1']
stack[-1]: 1
stack[-1](=1) vs num(=2)
stack[-1] < num 인 경우
pop한 stack: ['3']
k: 0
stack.append(num): ['3', '2']
num: 3
k: 0
stack.append(num): ['3', '2', '3']
num: 4
k: 0
stack.append(num): ['3', '2', '3', '4']
stack: ['3', '2', '3', '4']
stack[:-k]: ['3', '2', '3', '4']
'3234'
"""
다른 풀이
def solution(number, k):
answer = [] # Stack
for num in number:
while k > 0 and answer and answer[-1] < num:
answer.pop()
k -= 1
answer.append(num)
return ''.join(answer[:len(answer) - k])
참고)
[파이썬 python] 순열, 조합 코드로 구현하기
## 코딩테스트에서 자주 출제가 되는 순열과 조합문제를 기억하자! # 순열 구현하기 (1) - itertools 모듈 사용하기 # 코딩테스트에서 가장 효율적인 방법이다 (간단하고 빠르다) # # 목적: 한 개의 리
ckd2806.tistory.com
Programmers | 큰 수 만들기 - Python
1주차 알고리즘 스터디 - 탐욕법 (Greedy) : 프로그래머스 Level2 큰 수 만들기 접근 방식 및 풀이 과정
velog.io