티스토리 뷰
모든 조합을 짜고 max를 찾는건 미친짓이므로 패스...
sort를 쓰되, 세번째 인수로 커스텀 함수를 넣어주려고 한다.
a와 b가 있다면, 이를 문자열로 붙여주고 ab와 ba의 크기를 비교해서 큰 쪽으로 정렬되도록 만든다.
3, 30이 있따면 330, 303의 조합이 되고, 330이 크니까 3, 30으로 정렬되게끔 한다는 이야기이다.
이를 위해서는 모든 배열값들의 문자화가 필요했다.
sort의 사용자 정의 함수를 어찌 짜야할지 감이 안잡혀서 다시 한 번 공부했다.
bool compare(int a, int b) {
return a < b; //a < b가 true일때 정렬된다. 즉 오름차순 정렬
}
bool compare(int a, int b) {
return a > b; //a > b가 true일때 정렬된다. 즉 내림차순 정렬
}
대충 이렇게 이해했다.
내가 원하는대로 하려면 내림차순 정렬이어야 함.
bool compare(string a, string b) {
return a+b > b+a;
}
이렇게 하면 될 것 같다.
이젠 모든 numbers에 존재하는 정수값을 문자로 바꿔줄 시간이다.
문제는;; string<->int 사이 변환을 몰라서 찾아봐야했음.
문자 -> 숫자 | #include <string> | stoi(정수), stof(실수) |
숫자 -> 문자 | to_string() |
아니면 '0' 더하고빼기 방법도 사용 가능함
vector<string> numbertoStr;
for(int ele : numbers) {
numbertoStr.push_back(to_string(ele));
}
numbertoStr에 string으로 저장되었다. 정렬을 해준 후, 이 값을 string으로 반환해야한다.
근데 먼 뜬금없는 vector file을 찾을 수 없다는 오류가 뜸..

왜냐면... ㅅㅂ C였음...;; 언어체크는 항상 조심하자
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(string a, string b) {
return a+b > b+a;
}
string solution(vector<int> numbers) {
string answer = "";
vector<string> numToStr;
for(auto ele : numbers) {
numToStr.push_back(to_string(ele));
}
sort(numToStr.begin(),numToStr.end(),compare);
for(auto ele : numToStr) {
answer += ele;
}
return answer;
}
이대로 내면 실패가 하나 뜬다.
왜냐면 숫자는 중복일 수 있기 때문에, 0만 여러번 나오는 배열의 경우, 0000000 뭐 이렇게 반환하기 때문이다.
if(stoi(answer) == 0) {
answer = '0';
}
answer를 숫자로 바꿔서 0과 같으면 문자열 0으로 바꾸게끔 했으나...
해당 문제는 크기 관련 문제인 것 같았다.
문제의 숫자가 너무 크기 떄문에, 숫자로 전환하는 것 자체를 삼가야 하는듯.
if(answer[0] == '0')
answer = '0';
앞자리수만 0인지 체크하는 것으로 바꿨다.
설령 숫자전환 방법이 된다고 했더라도 비효율적이지 않았을까 싶다.
숫자의 자리수를 비교하게 되는 경우, 문자열로의 전환도 생각해볼 것!
그리고 sort의 커스텀 함수 이용법과, 문자와 숫자간의 전환에 대해 익숙해질 것.
'■ 알고리즘 > ◻ Programmers' 카테고리의 다른 글
[C++]최소직사각형 (0) | 2022.11.10 |
---|---|
[C++]H-Index (0) | 2022.11.10 |
[C++] K번째수 (0) | 2022.11.09 |
[C++] 위장 (0) | 2022.11.09 |
[C++] 전화번호 목록 (0) | 2022.11.09 |