Problem Solving/Programmers
Programmers [탐욕법 Greedy] : 큰 수 만들기 풀이 및 코드
이진2
2020. 10. 1. 15:44
programmers.co.kr/learn/courses/30/lessons/42883?language=cpp
코딩테스트 연습 - 큰 수 만들기
programmers.co.kr
풀이에 따라 시간이 확연하게 차이나는 큰 수 만들기 문제
주어진 숫자에서 k개의 숫자를 제거했을 때 가장 큰 수를 반환해야 한다
하지만 정석적으로 N자리의 숫자 중 K개를 제거하는 경우를 모두 구하면 아래 사진의 오른쪽 위와 같은 공식이 나온다
그렇기에 최대 백만자리에서는 시간초과가 날 수 밖에
그렇기 때문에 다음과 같이 풀어줬다
len = number의 length - k (목표 문자열 길이)라고 했을 때,
① number내의 모든 문자를 탐색하면서 현재 인덱스부터 뒤에서 len개만큼 확인하면서 최댓값을 구한다
② 구한 최댓값을 answer에 push하고 해당 문자열의 index를 현재 index로 한다
③ 그리고 숫자의 최댓값은 9이기 때문에 9가 처음 나오면 바로 2번을 수행해준 뒤 break해준다
예제의 4177252841에서는 4개를 제거하면 결과적으로 6자리의 숫자가 나와야 한다
- 417725 중 최댓값인 세번째 7을 answer에 push한 후 인덱스=3(+1)
- 725 (뒤에서 4개는 접근X) 중 최댓값인 7을 push한 후 인덱스 = 4(+1)
와 같이 실행하면, 결과값인 775841이 나온당
#include <string>
#include <vector>
using namespace std;
string solution(string number, int k) {
string answer = "";
int len = number.length() - k;
for (int i = 0; i < number.size(); i++) {
if (!len)break;
int n=number[i]-'0',index=i;
for (int j = i+1; j <= number.size() - len; j++) {
if (number[j] - '0' > n) {
n = number[j] - '0';
index = j;if(n==9)break;
}
}
answer.push_back(n + '0');
i = index; len--;
}
return answer;
}
dfs로 풀면 O(k∑nPi)로 매우매우매우 크지만, 위와 같이 풀면 O(n^2)로 해결할 수 있당