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 등)
- ...: 형식 지정자에 따라 삽입될 값들
반환 값
- 함수가 성공하면 출력된 문자 수를 반환
- 오류가 발생하면 음수를 반환
'프로그래머스' 카테고리의 다른 글
[프로그래머스/C] 전력망을 둘로 나누기 (0) | 2024.06.23 |
---|---|
[프로그래머스/C] 큰 수 만들기 (0) | 2024.06.22 |
[프로그래머스/C] 주식가격 (0) | 2024.06.22 |
[프로그래머스/C] 특이한 정렬 (0) | 2024.06.21 |
[프로그래머스/C] 피로도 (0) | 2024.06.20 |