본문 바로가기

개발 관련 기타/알고리즘

[프로그래머스] (C++) 가장 큰 수

문제

 

코딩테스트 연습 - 가장 큰 수 | 프로그래머스

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

programmers.co.kr

힌트

  • 다른 자릿수 끼리 크기 비교는 어떻게 하면 좋을까? (예: 한자리 숫자에 10을 곱해서 두자리 숫자랑 비교 해볼까?)

소스코드 (첫번째 시도)

 

// [프로그래머스] 가장 큰 수

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

string solution(vector<int> numbers) {
  string answer = "";

  vector<pair<int,int>> pair_vec;

  vector<int>::iterator numbers_iter;
  for (numbers_iter = numbers.begin(); numbers_iter != numbers.end(); numbers_iter++) {
    if (*numbers_iter >= 10) {
      if (*numbers_iter >= 100) {
        if (*numbers_iter >= 1000) pair_vec.push_back(make_pair(3, *numbers_iter));
        else pair_vec.push_back(make_pair(2, *numbers_iter * 10 + (*numbers_iter / 100) * 1));
      } else pair_vec.push_back(make_pair(1, *numbers_iter * 100 + (*numbers_iter / 10) * 11));
    } else pair_vec.push_back(make_pair(0, *numbers_iter * 1000 + *numbers_iter * 111)); 
  }

  std::sort(pair_vec.begin(), pair_vec.end(), [](const pair<int,int> & a, pair<int,int> & b) -> bool {
    if (a.second == b.second) return a.first < b.first;
    else return a.second > b.second;
  }); 
    
  vector<pair<int,int>>::iterator pair_vec_iter;
  for (pair_vec_iter = pair_vec.begin(); pair_vec_iter != pair_vec.end(); pair_vec_iter++) {
    int element;
    if (pair_vec_iter->first == 0) element = (pair_vec_iter->second - ((pair_vec_iter->second / 1000) * 111)) / 1000;
    else if (pair_vec_iter->first == 1) element = (pair_vec_iter->second - ((pair_vec_iter->second / 1000) * 11)) / 100;
    else if (pair_vec_iter->first == 2) element = (pair_vec_iter->second - (pair_vec_iter->second / 1000)) / 10;
    else element = pair_vec_iter->second;
    answer.append(to_string(element));
  }
  return answer;
}
  • 채점 결과 (36.4 / 100.0)
    • 정확성 (36.4 / 100.0)