본문 바로가기
프로그래머스

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

by jonnwon 2024. 6. 22.
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/42746#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    char str1[10];
    char str2[10];
    
    sprintf(str1, "%d%d", *(int *)a, *(int *)b);
    sprintf(str2, "%d%d", *(int *)b, *(int *)a);
    return strcmp(str2, str1);
}

char* solution(int numbers[], size_t numbers_len) {
    char* answer = (char*)malloc(sizeof(char) * 4 * numbers_len);
    int cnt = 0;
    answer[0] = '\0';
    
    qsort(numbers, numbers_len, sizeof(int), compare);
    
    for (int i = 0; i < numbers_len; i++) {
        char buffer[5];
        sprintf(buffer, "%d", numbers[i]);
        strcat(answer, buffer);
    }
    if (answer[0] == '0')
        answer[1] = '\0';
    answer = (char *)realloc(answer, sizeof(char) * (strlen(answer) + 1));
    return answer;
}

 

숫자들을 단순히 크기 순서대로 정렬하는 것이 아니라, 두 숫자를 특정 순서로 조합했을 때 더 큰 값을 만들 수 있는 순서로 정렬해야 하기 때문에 숫자들을 조합하여 만들어진 문자열을 비교한다.

 

compare 함수를 통해 numbers 배열을 내림차순 정렬 후 numbers배열의 요소들을 합쳐준다.

 

compare 함수

1. 두 정수를 문자열로 변환하여 두 가지 순서로 결합하고, strcmp를 사용하여 비교

2. str2가 str1 보다 사전순으로 더 뒤에 있다면 (str2 > str1 이라면), strcmp를 통해 양수를 반환하게 하여 b가 a보다 앞으로 오게 해야함. 즉, strcmp(str2, str1)가 양수를 반환 시 b가 a보다 앞에 오게 됨

 

ex) a = 30, b = 3 일 때,

str1 = "303", str2 = "330" 이고, str1 < str2 이기 때문에 strcmp 는 양수를 반환하여 b가 a보다 앞으로 오게 됨

 

3. 내림차순 정렬을 수행하여 더 큰 수를 만들 수 있는 순서를 결정

핵심 예외처리

  • [0, 0, 0, 0] 처럼 모든 원소가 0인 경우 "0" 을 리턴해야한다. (마지막 if 문을 통해 처리)

 

 

 

참고) strcmp

int strcmp(const char *str1, const char *str2);

 

두 문자열을 비교하는 데 사용

 

매개변수

  • const char *str1: 비교할 첫 번째 문자열의 포인터
  • const char *str2: 비교할 두 번째 문자열의 포인터

반환 값

  • 반환 값이 0인 경우: 두 문자열이 동일
  • 반환 값이 0보다 작은 경우: 첫 번째 문자열이 두 번째 문자열보다 사전순으로 앞에 있다.
  • 반환 값이 0보다 큰 경우: 첫 번째 문자열이 두 번째 문자열보다 사전순으로 뒤에 있다.

 

 

참고) sprinf

int sprintf(char *str, const char *format, ...);

 

형식화된 문자열을 버퍼에 저장하는 데 사용

 

매개변수

  • char *str: 결과 문자열을 저장할 버퍼의 포인터
  • const char *format: 출력 형식을 지정하는 서식 문자열. 형식 지정자(예: %d, %s, %f 등)
  • ...: 형식 지정자에 따라 삽입될 값들

반환 값

  • 함수가 성공하면 출력된 문자 수를 반환
  • 오류가 발생하면 음수를 반환
728x90