[ C++ ] 프로그래머스 코딩테스트 연습 - 가장 큰 수
✏️ PS/Programmers

[ C++ ] 프로그래머스 코딩테스트 연습 - 가장 큰 수

반응형

 

안녕하세요? 수구리입니다.

 

이번 포스팅에서는 프로그래머스의 코딩 테스트 연습 문제를 가져왔습니다!

 

정렬에 관한 내용이므로 vector를 사용해서 오름차순으로 정렬해보는 문제입니다.

 

문제는 아래 링크에 있습니다.

 

 

 

[ 문제 ] 코딩테스트 연습 - 가장 큰 수

 

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

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

programmers.co.kr

 

 

[ 나의 풀이 ]


#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;
    //string으로 바꾼후 벡터에 집어넣는다.
    for (auto num : numbers)
        temp.push_back(to_string(num));
    //더할때 오름차순으로 정렬한다.
    sort(temp.begin(), temp.end(), cmp);
    //처음 숫자가 0이라면 0을 반환
    if (temp.at(0) == "0") return "0";
    //처음부터 끝까지 문자열 합치고 리턴
    for (auto num : temp)
        answer += num;
    return answer;
}

 

 

 

 

[ 설명 ]

1. string solution 함수를 작성하는 문제입니다. 함수의 인자로 numbers라는 정수형 vector가 주어집니다.

2. answer 라는 string 변수를 선언하고, temp라는 string vector를 선언합니다.

3. 함수의 인자로 입력받은 numbers의 값을 하나씩 (num) 추출해서 반복을 수행합니다.

4. temp vector에 num을 string으로 형 변환을 수행하고, push_back 함수를 통해서 값을 추가해줍니다.

5. 반복문이 끝나고, temp를 처음부터 끝까지 cmp 함수를 통해서 정렬을 수행해줍니다.

6. cmp 함수를 통해 오름차순으로 정렬합니다.

7. 만약 temp가 "0"만 들어있다면 "0"을 리턴해줍니다.

8. 마지막으로 정렬한 temp를 하나씩 꺼내서 answer에 문자열 결합을 해줍니다.

9. answer를 리턴합니다.

 

 

[ python ] 문제 풀이 - 1차 시도

def solution(numbers):
    answer = []
    for num in numbers:
        answer.append(str(num))

    answer.sort(key=lambda x: x*3, reverse=True)
    return ''.join(answer)

입력으로 들어온 numbers 리스트에는 int 형으로 데이터가 저장되어있다.

그래서 각 요소를 str로 변경한 후,

lambda 식을 통해 x * 3 (인수의 값이 1000 이하이므로 3자리 수로 맞추고 비교)를 계산하여 역순으로 정렬한다.

그러고 answer에는 리스트 형태로 되어있으므로 이를 빈 문자열 ('')과 join을 통해 값을 반환하니

11번째 테스트케이스에서 실패하였다.

 

[ python ] 문제 풀이 - 2차 시도

def solution(numbers):
    answer = []
    for num in numbers:
        answer.append(str(num))

    # num의 인수값이 1000 이하이므로 3자리수로 맞춘 후 비교
    answer.sort(key=lambda x: x * 3, reverse=True)
    
    # '000’을 처리하기 위해 int로 변환한 뒤, 다시 str로 변환
    return str(int(''.join(answer)))

약간의 구글링을 통해서 마지막 리턴 값을 int로 변환한 뒤 다시 str로 변환하니 통과할 수 있었다.

왜냐하면 정렬된 결과가 ['0', '0', '0']이라면 이를 문자열로 join을 하게 되면 '000'으로 합쳐진다.

따라서 이를 return 하여 케이스에 통과하지 못했던 것인데..

int형으로 한번 변환을 해주면 '000'이 0으로 바뀌고 이게 다시 '0'이 되므로 케이스에 통과할 수 있었다.

 

반응형