Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 그리디
- C++
- Stack
- 문제풀이
- mysql
- NeuralNetwork
- 탐색
- 프로그래머스
- 플로이드와샬
- 백트래킹
- 알고리즘
- Greedy
- Blockchain
- BFS
- dfs
- 그래프
- 부르트포스
- DeepLearning
- sigmoid
- ios
- 캡스톤정리
- Algorithm
- Swift
- Docker
- 백준
- 풀이
- 실버쥐
- ReLU
- dp
- Node.js
Archives
- Today
- Total
개발아 담하자
[프로그래머스/C++] 큰 수 만들기 풀이 본문
프로그래머스 : 큰 수 만들기
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42883
문제 설명
어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건
- number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
- k는 1 이상 number의 자릿수 미만인 자연수입니다.
너무 어려운 그리디 알고리즘 ,, 😭😭
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
string solution(string number, int k){
vector<char> bucket; // 조합하고자 하는 배열
vector<int> removeAt; // 제거하는 배열
// 주어진 숫자로부터 하나씩 꺼내 모으면서, 모아둔 것 중 지금 등장한 것보다 작은 것들을 빼낸다
for(const auto letter: number){
// 현재 조합하고자 하는 배열이 비어있는 경우
if(bucket.empty()){
bucket.push_back(letter);
continue;
}
// 현재 숫자들이 추가 될 숫자보다 작은 경우 -> 제거
while(!bucket.empty() && removeAt.size()!=k && bucket.back()<letter){
removeAt.push_back(bucket.back());
bucket.pop_back();
}
bucket.push_back(letter);
}
string answer = removeAt.empty() ? number.substr(0, number.size()-k) : string(bucket.begin(), bucket.end());
return answer;
}
'👩💻 알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] N개의 최소공배수 풀이 (0) | 2020.03.17 |
---|---|
[프로그래머스/C++] 소수 찾기 풀이 (0) | 2020.03.11 |
[프로그래머스/C++] 서머코딩/윈터코딩(2019) 멀쩡한 사각형 풀이 (0) | 2020.03.11 |
[프로그래머스/C++] 2017 카카오 예선 : 카카오프렌즈 컬러링북 풀이 (0) | 2020.02.07 |
[프로그래머스/C++] 위장 풀이 (0) | 2020.01.21 |