백준 1181번 단어 정렬

honeyricecake·2022년 2월 23일
1

백준

목록 보기
19/30

https://www.acmicpc.net/problem/1181

  1. 내 코드
#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이면 즉, 앞의 문자열과 같은 문자열이면 문자열을 출력하지 않는 것이다.

이미 정렬되어 있는 배열이라 위와 같이 할 수 있었다.

  1. 다른 사람의 코드

내 코드가 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는 개행문자를 받아와서 널문자로 변환하므로 버퍼에 있는 개행문자를 받아온다.

  1. scanf의 공백은 버퍼에서 공백 및 개행문자를 받아온다.

3.puts는 문자열 하나를 출력할 때마다 개행문자를 자동으로 같이 출력해준다.

0개의 댓글