본문 바로가기

알고리즘/프로그래머스

[Lv2]가장 큰 수(C++)

1. 문제

programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 ��

programmers.co.kr

2. 접근 방법

1) 처음에 "한자리수 끼리 비교하는 법 ", "두 자리 수끼리 비교하는 법".. 등 자리수 별로 조건을 달리해야 하나 고민이 있었다. 그런데 많은 자리수를 일일히 다 비교하는 게 말이 안된다고 생각했고, 다른 방법으로 접근했다.

 

2) string으로 표현하라는 게 힌트라고 생각했다. 예를 들어 10, 1이 있다고 하면 101 보다 110이 크다는 것을 어떻게 알아낼까.. 하다가 두 값을 string으로 바꿔서 string a = '10', string b = '1'이라고 하면 a + b= '101' , b + a = '110'으로 쉽게 대소 비교를 할 수있었다. 그래서 string단위로 대소 비교를 위한 compare함수를 만들었다.

 

3) string으로 숫자를 표현할 땐 항상 가장 첫 자리 수가 0으로 시작하는 지를 유의하자.

 

3. 실수했던 것 & 새로 안 것

 1) string 자체로 비교하는 법

 

 

4. 코드

더보기
// 0 처리 주의할 것
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool comp( string a, string b) {
    return a + b > b + a ? true: false;
}

string solution(vector<int> numbers) {
    vector<string> v;
    string answer= "";
    for (auto x : numbers) { //numbers를 string으로 바꿔서 다시 저장
        v.push_back(to_string(x));
    }
    sort(v.begin(),v.end(),comp); //정렬

    for (auto x : v)
        answer += x;
    
    if (answer[0] == '0')
        return "0";
    
    return answer;
}

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[Lv2] 행렬 테두리 회전하기(python)  (0) 2021.07.28
[Lv2]소수찾기(C++)  (0) 2020.10.23
[Lv1] K번째 수(C++)  (0) 2020.10.17
[Lv2]구명보트(C++)  (0) 2020.10.17
[Lv2]삼각달팽이(C++)  (0) 2020.10.17