-
[프로그래머스] 가장 큰 수알고리즘/프로그래머스 2021. 7. 6. 20:49
문자열 정렬에 대해 한 번 더 생각해보게 되는 문제입니다. 두 문자열 "31", "9"를 이용해 만들 수 있는 가장 수의 문자열 형태는 "931"입니다. 이 경우는 오름차순만해도 답이 되지만, "3", "31", "9"는 "9331"이 최대 숫자이므로 단순한 오름차순, 내림차순으로는 답을 구할 수 없습니다. 이 문제를 풀기 위해서는 각 문자열을 비교할 때 그 둘을 이어 붙여 만든 문자열 중 큰 것을 기준해서 내림차순을 하면 됩니다. 가령 "31"과 "9"를 비교하면 "931"이 "319"보다 크므로 "9", "31" 순서로 정렬이 되는 거죠. 한 가지 예외 상황이 있는데 인수에 0이 여러 개 들어있다면 그 들어있는 0만큼 결과가 나온다는 겁니다. {0, 0, 0}을 인수로 넣으면 답이 000이 되는 거죠. 0번째 인덱스가 '0'일 때는 "0"을 반환하면 됩니다. 내림차순를 한 문자열의 첫 번째 인덱스가 0이라면 0이 하나 이상 있다는 의미이기 때문입니다.
풀이
#include <string> #include <vector> #include <algorithm> using namespace std; string solution(vector<int> numbers) { string answer = ""; vector<string> strings; for (size_t i = 0; i < numbers.size(); ++i) strings.push_back(to_string(numbers[i])); sort(strings.begin(), strings.end(), [](string& a, string& b) { return (a + b) > (b + a); }); for (size_t i = 0; i < strings.size(); ++i) answer.append(strings[i]); if (answer[0] == '0') return "0"; return answer; }
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 가장 큰 정사각형 찾기 (0) 2021.07.11 [프로그래머스] 스킬트리 (0) 2021.07.09 [프로그래머스] 소수 찾기 (0) 2021.07.06 [프로그래머스] 기능 개발 (0) 2021.07.06 [프로그래머스] 124의 나라 (0) 2021.07.04