코딩/백준 문제 (실버)

[백준/1181/C언어] 단어 정렬 _ 풀이

룻밤 2023. 9. 1. 20:09

 

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