https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
풀이
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
int len;
char ss[51];
}word;
int compare(const void* first, const void* second) {
word a = *(word*)first;
word b = *(word*)second;
// 문자열 길이를 오름차순으로
if (a.len < b.len) return -1;
else if (a.len > b.len) return 1;
// 문자열 길이가 같다면 사전순으로
else return strcmp(a.ss, b.ss);
}
int main() {
int n;
scanf("%d", &n);
word* s = (word*)malloc(n * sizeof(word));
// 문자열 입력
for (int i = 0; i < n; i++) {
scanf("%s", &s[i].ss);
s[i].len = strlen(s[i].ss); //문자열 길이 저장
}
// 퀵솔트로 정렬
qsort(s, n, sizeof(s[0]), compare);
// 중복 없이 출력
for (int i = 0; i < n; i++) {
// strcmp함수로 비교해서 0이 아닐때만 출력
if(strcmp(s[i].ss, s[i+1].ss) != 0) {
printf("%s\n", s[i].ss);
}
}
free(s);
return 0;
}
2차원 배열로 만들면 문제가 꽤나 복잡해지기 때문에 구조체를 만들어 풀어보았다.
꽤나 난항을 겪었는데 이문제를 통해
- qsort의 compare 함수 응용 활용법
- 구조체를 언제 사용하는지
- strcmp()함수의 적재적소 사용
대략 3가지 정도 배운것 같다.
qsort 사용법
https://twpower.github.io/56-qsort-in-c
strcmp() 사용법
https://www.ibm.com/docs/ko/i/7.3?topic=functions-strcmp-compare-strings
'코딩 > 백준 문제 (실버)' 카테고리의 다른 글
[백준/1436/C언어] 영화감독 숌 _ 풀이 (0) | 2023.09.03 |
---|---|
[백준/24313/C언어] 알고리즘 수업 - 점근적 표기 1 _ 풀이 (0) | 2023.09.02 |
[백준/11650/C언어] 좌표 정렬하기 _ 풀이 (0) | 2023.09.01 |
[백준/25206/C언어] 너의 평점은 _ 풀이 (0) | 2023.08.29 |
[백준/2941/C언어] 크로아티아 알파벳 _ 풀이 (0) | 2023.08.23 |