본문 바로가기

C언어_VisualStudio_실습

문자열 예제: strcmp를 이용하여 사전순서로 정리 (오름차순/내림차순 정리)

오늘은 문자열을 오름차순이나 내림차순으로 정리하는 예제를 풀어볼 것이다. 이 예제는 strcmp를 사용하는 것을 익히기 위한 문제였는데 하다가 도저히 감이 안 잡혀서 찾아봤는데 내가 원하는 방법이 안 나와서 꼭꼭 예제와 풀이를 적어두고 싶었다. :-)

 

문제 -> 풀이 -> 코드 순서로 되어있어요!

[ 문제 ]

20보다 작은 양의 정수 n을 입력받고 n개의 문자열을 입력받으세요. 문자열의 사전 순서로 가장 앞에 있는 문자열을 출력하세요. (단 문자열은 모두 소문자로 이루어져 있으며 길이가 20을 넘지 않습니다. 같은 문자열은 없습니다.)

 

[ 풀이 ]

우선 굵은(?) 길을 생각해보자.

이 예제는 strcmp를 사용해야 하기 때문에 #include <string.h>를 적어야 한다.

n개의 문자열을 받아야 하고 각 문자열은 길이가 20이 넘지 않으니 이차원 배열로 선언하는 것이 좋다.

그리고 어떠한 상황이든 순서대로 정리할 때는 두 개의 위치를 바꿔줄 때 그 값을 임시로 담아줄 문자열 변수 temp도 선언한다. 

그러면 이제 문제의 순서대로 한 문장씩 코드로 작성해보자.

/* 20보다 작은 양의 정수 n을 입력 받고 n개의 문자열을 입력 받으세요.*/
// 정수 n 선언
int n;	
// n개의 문자열 선언, n은 20보다 작고 각 문자열도 20보다 작다.
char str[20][20];	
// 정수 n을 사용자로부터 입력받음
scanf("%d", &n);
// n개의 문자열을 사용자로부터 입력받음
for (int i = 0; i < n; i++) scanf("%s", str[i]);

이다음에 해주어야 할 것이 입력받은 문자열들을 사전 순서대로 정리해하는 작업이다. 이때 이중 반복문을 사용하여 비교하고자 하는 문자열과 그다음 문자열을 비교한 후 사전 순서대로 되어있지 않으면 자리를 바꿔 사전 순서대로 정리해준다.

strcmp(str1, str2)는 비교하는 두 문자열이 같으면 0을 반환하고 닿으면 양수나 음수를 반환한다. 문자열을 비교할 때 아스키코드로 비교하기 때문에 먼저 적어준 문자열(str1)이 뒤에 적어준 문자열(str2)보다 사전 순서로 앞이면 음수를 뒤면 양수를 반환한다. 즉, strcmp(str1, str2) 값이 양수가 나올 때 두 문자열의 순서를 바꿔주면서 사전 순서대로 정리하는 것이다. (참고; strcmp(str1, str2) 값이 음수가 나올 때 두 문자열의 순서를 바꿔주면 내림차순으로 정리할 수 있다.)

// 문자열의 사전순서로
for (int i = 0; i < n - 1; i++) {
	for (int j = i + 1; j < n; j++) {
		if (strcmp(str[i], str[j]) > 0) {	// 사전순서대로 되어있지 않으면 두 문자열의 위치를 바꿔준다.
			strcpy(temp, str[i]);	// 바꿀 때 임시로 temp에 저장한다.
			strcpy(str[i], str[j]);
			strcpy(str[j], temp);
		}
	}
}

이제 str에 있는 문자열들은 사전 순서대로 정리되었을 것이다. 그러면 우리는 맨 앞에 있는 문자열인 str[0]을 출력하면 된다.

//가장 앞에있는 문자열을 출력하세요.
printf("%s", str[0]);

 

[ 코드 ]

#pragma warning(disable:4996)	// scanf 오류 방지
#include <stdio.h>
#include <string.h>	//문자열 표준함수를 사용하기 위한 헤더파일

int main() {
	int n;	// 정수 n 선언
	char str[20][20], temp[20];	// str문자열 선언, 임시로 저장할 문자열 temp 선언
	scanf("%d", &n);	// 정수 n을 사용자로부터 입력받음
	for (int i = 0; i < n; i++) scanf("%s", str[i]);	// n개의 문자열을 사용자로부터 입력받음
	for (int i = 0; i < n - 1; i++) {
		for (int j = i + 1; j < n; j++) {
			if (strcmp(str[i], str[j]) > 0) {	// 사전순서대로 되어있지 않으면 두 문자열의 위치를 바꿔준다.
				strcpy(temp, str[i]);	// 바꿀 때 임시로 temp에 저장한다.
				strcpy(str[i], str[j]);
				strcpy(str[j], temp);
			}
		}
	}
	printf("%s", str[0]);
	return 0;
}