https://www.acmicpc.net/problem/1181
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char array[20000][51];
int stringcomp(char* brray, char* crray)
{
int x = strlen(brray);
int y = strlen(crray);
if (x < y) return -1;
else if (x > y) return 1;
else
{
return strcmp(brray, crray);
}
}
int main()
{
int i, N;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%s", &array[i]);
}
qsort(array, N, 51 * sizeof(char), stringcomp);
printf("%s\n", array[0]);
for (i = 1; i < N; i++)
{
if(strcmp(array[i - 1], array[i])) printf("%s\n", array[i]);
}
return 0;
}
처음으로 C언어 내장함수인 qsort를 써보았다.
내장 헤더파일은 <stdlib.h>이며
사용법은 다음과 같다.
qsort(배열의 주소, 요소의 개수, 요소 하나의 크기 * 요소의 개수, 비교함수)
이 때 비교 함수는 왼쪽이 앞서면 -1, 오른쪽이 앞서면 1, 같으면 0을 리턴하는 함수여야 한다.
그리고 같은 문자열의 경우 1번만 출력되어야 하기에
if(strcmp(array[i - 1], array[i])) printf("%s\n", array[i]);
이를 추가하였다.
if안이 0이면 즉, 앞의 문자열과 같은 문자열이면 문자열을 출력하지 않는 것이다.
이미 정렬되어 있는 배열이라 위와 같이 할 수 있었다.
내 코드가 32ms가 걸려 중간 정도의 순위를 기록하였는데
이가 만족스럽지 못하여 24ms의 시간이 걸린
koreatlwls(https://www.acmicpc.net/source/8587842)님의 코드를 공부해보기로 하였다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct WORDBOOK
{
int len;
char word[51];
};//오 구조체를 따로
struct WORDBOOK wb[20001];//그 구조체로 이루어진 배열
int cmp(struct WORDBOOK *a, struct WORDBOOK *b)
{
return a->len > b->len ? 1 : a->len < b->len ? -1 : strcmp(a->word, b->word);
}//나랑 같은 아이디어
int main()
{
int N;
scanf("%d ", &N);//getchar로 버퍼를 비워주거나 혹은
for (int i = 0; i<N; i++)
{
gets(wb[i].word);//아 gets를 썼구나
wb[i].len = strlen(wb[i].word);
}
qsort(wb, N, sizeof(struct WORDBOOK), cmp);
int temp = 0;
for (int i = 1; i <= N; i++)
{
if (strcmp(wb[temp].word, wb[i].word))
{
puts(wb[temp].word);//그리고 puts를 썼네, puts는 자동으로 개행까지 되는구나!!
temp = i;
}
}
return 0;
}
내 코드를 위의 코드를 피드백하여 gets, puts를 사용하고 마지막 for문을 array[0]를 따로 출력하지 않고 코드를 깔끔하게 정리하니 28ms가 나왔다.
이 4ms차이는 반올림 차이 때문이라 생각한다.
정리
1.gets는 개행문자를 받아와서 널문자로 변환하므로 버퍼에 있는 개행문자를 받아온다.
3.puts는 문자열 하나를 출력할 때마다 개행문자를 자동으로 같이 출력해준다.