https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
C (코드)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char str[20001][51];
int compare(const void* a, const void* b)
{
if (strlen(a) > strlen(b)) return 1;
else if (strlen(a) < strlen(b)) return -1;
else return strcmp(a,b);
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%s", str[i]);
qsort(str, n, sizeof(str[0]), compare);
for (int i = 0; i < n; i++) if (strcmp(str[i], str[i+1])) printf("%s\n", str[i]);
return 0;
}
C++ (코드)
#include <iostream>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;
bool compare(string a, string b)
{
if (a.length() == b.length()) return a < b;
else return a.length() < b.length();
}
int main()
{
int n;
cin >> n;
string* arr = new string[n];
for (int i = 0; i < n; i++) cin >> arr[i];
sort(arr, arr+n, compare);
string check = "";
for (int i = 0; i < n; i++)
{
if (check == arr[i]) continue;
cout << arr[i] << "\n";
check = arr[i];
}
delete[]arr;
return 0;
}
코드 설명
main함수에서는 단어의 개수를 입력받고, 단어를 저장할 배열에 반복문을 사용해서 단어들을 계속 입력받는다. 이후 정렬을 해주는데, c++은 <algorithm> 헤더파일에 내장되어 있는 sort함수를 사용했다. 인수로 compare함수를 사용했는데, 어떤 기준으로 배열을 정렬할지에 관한 함수이다. compare함수에서는 문제에서 제시된 조건을 적용했다. 먼저 길이를 비교한 후에 길이가 짧은 것이 먼저 오도록 하고, 단어의 길이가 같은 경우에는 사전순으로 정렬하도록 함수의 return문을 작성했다. c는 qsort를 사용했다. compare함수도 c++과 유사하게 작성했다!
정렬이 된 후에는 반복문을 사용해서 단어들을 출력하는데, c는 strcmp함수를 사용해서 현재 단어와 바로 다음 단어를 비교해서 다를 경우에만 출력하게 한다 .(strcmp함수는 비교하는 문자열들이 같으면 0, 다르면 1을 반환하는 것을 if문의 조건에 사용했다. ) c++은 check라는 문자열을 비교하는 데 사용한다. check와 단어를 비교해서 다를 경우에만 출력한다. c++은 동적배열을 사용했기에 해제해줬다.
느낀 점
compare 함수만 잘 작성하면 되는 문제였다. 물론 나는 그게 어려워서 몇 번 틀리고 에러도 났었는데, 그래도 결국 풀어서 통과했다! 그리고 strcmp 함수를 아무생각없이 string 에 적용했다가 오류가 났었다. 계속 열심히 해야겠다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C & C++] 1296 팀 이름 정하기 (0) | 2022.11.05 |
---|---|
[백준/C & C++] 1302 베스트셀러 (0) | 2022.11.05 |
[백준/C & C++] 11050 이항 계수 1 (2) | 2022.10.05 |
[백준/C & C++] 2914 저작권 (2) | 2022.10.04 |
[백준/C & C++] 2798 블랙잭 (2) | 2022.10.04 |