일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 동적계획법
- 병행성 관련 오류
- Direct12
- 프로그래머스
- 그리디 알고리즘
- 타입 객체
- 락
- 멀티프로세서
- 디자인패턴
- DirectX 12
- DirectX12
- 멀티쓰레드
- 영속성
- 백준
- 운영체제
- 다이나믹프로그래밍
- codility
- I/O장치
- 다이나믹 프로그래밍
- 그리디알고리즘
- 컨디션 변수
- directx
- 렌더링 파이프라인
- 병행성
- 자료구조
- 스케줄링
- OS
- 파일시스템 구현
- 알고리즘
- 쓰레드
- Today
- Total
기록공간
가장 큰 수(프로그래머스) 본문
정렬 조건을 정하여 정렬하는 문제이다.
위 설명처럼 순열을 모두 구해서 내림차순으로 정렬하는 방법을 생각해 볼 수 있다. 값은 정확하게 나오지만 순열의 개수는 (numbers의 원소의 개수)! (팩토리얼)이기 때문에 원소의 갯수가 많을수록 기하급수적으로 많아진다. 결국 시간 초과가 되므로 이 방법은 쓸 수 없다.
(STL에서 제공하는 next_permutation을 사용하면 순열을 쉽게 구할 수 있으므로 한번 시도해보는 것도 나쁘지 않다)
정렬을 내림차순으로 하더라도 [6, 10, 2] 같은 경우 [10, 6, 2]로 1062가 되므로 가장 큰 수를 만족하지 못한다. 하지만 원소들을 string으로 바꾸고 서로의 조합을 통해 비교해서 정렬하면 어떨까?
예를 들어 [6, 10, 2]가 있다면 이를 string으로 바꾼다. ["6", "10", "2"] 이제 정렬을 해보자. 우선 "6"과 "10"의 정렬 작업을 한다. 그냥 서로를 비교해서 정렬하면 위와 다를 것이 없다. 하지만 서로 조합하면 어떨까? "6"+ "10"은 "610"이다. 반대로 "10" + "6"은 "106"이다. 이 둘을 비교해보면 "610"이 더 크다는 것을 알 수 있다. 그러면 numbers는 그대로 ["6", "10", "2"]가 될 것이다. 이제 "10"과 "2"에 대해 정렬 작업을 한다. "10"+ "2"은 "102"이다. 반대로 "2" + "10"은 "210"이다. "210"이 더 크기 때문에 numbers는 정렬 작업을 통해 ["6", "2", "10"]이 된다. 이 배열의 원소들을 차례대로 answer에 더해주면 "6210"으로 가장 큰 수가 만들어 진다.
하지만 한가지 경우를 생각해야 한다. 바로 정렬한 맨 앞 원소의 첫번째 문자가 0인 경우이다. 이 경우에는 answer에 직접 "0"을 대입해주면 된다.
코드는 다음과 같다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(string a, string b) {
return a + b > b + a;
}
string solution(vector<int> numbers) {
string answer = "";
vector<string> temp;
for (auto num : numbers) {
temp.push_back(to_string(num));
}
sort(temp.begin(), temp.end(), cmp);
for (auto str : temp) {
answer += str;
}
if (temp[0] == "0") answer = "0";
return answer;
}
'Algorithm > 문제' 카테고리의 다른 글
전화번호 목록 (프로그래머스) (0) | 2020.05.11 |
---|---|
완주하지 못한 선수(프로그래머스) (0) | 2020.05.08 |
DNA (백준 - 1969번) (0) | 2020.03.29 |
멀티탭 스케줄링 (백준 - 1700번) (0) | 2020.03.29 |
수리공 항승 (백준 - 1449번) (0) | 2020.03.29 |