오늘은 문자열을 오름차순이나 내림차순으로 정리하는 예제를 풀어볼 것이다. 이 예제는 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;
}
'C언어_VisualStudio_실습' 카테고리의 다른 글
369게임 박수치기; while문, if문 (0) | 2021.06.11 |
---|---|
주문한 카페 메뉴 총 금액 출력하기; while문, switch문 (0) | 2021.06.10 |
[C언어] 조건문 예제: 절대값 출력, 학점 프로그램 (0) | 2021.05.31 |
[C언어] 사용자 정의 함수의 예제 : 큰 값 출력 함수, 구구단 출력 함수, 양수 입력 받는 함수, 아스키코드 출력 함수 (0) | 2021.05.27 |
[C 언어] 표준함수 사용해보기 : 수학함수, 랜덤함수, 외부 프로그램 실행 (0) | 2021.05.25 |