아 파이썬으로 풀고 싶다... 이 문제를 시플플로 풀면서 공부할 수 있는 부분이 많을 것 같다. 우선 클래스로 풀어야하나 생각이 든다. Class2의 첫 번째 실버 문제인데 어떻게 풀어야될지 감도 안 잡혀서 C++ 책을 뒤져보면서 코드를 끄적거리기 시작했다. 우선 구현할 줄 아는 것부터 구현하고 내가 모르는 부분을 하나 구현하기 시작했다. 이 글은 조금 길어질 것 같다는 직감이 들기 시작했다. 먼저 구현해본 것은 문자열과 그 길이를 받는 것이다. 코드는 아래와 같다.
# include "iostream"
using namespace std;
class hello{
public:
string name;
int lenOfName;
};
int main(void){
int N;
hello arr[10000];
cin >> N;
for (int i = 0; i < N; i++){
cin >> arr[i].name;
arr[i].lenOfName = arr[i].name.length();}
for (int i = 0; i < N; i++){
cout << arr[i].name << arr[i].lenOfName << "\n";}
return 0;
}
우선 여기까지는 잘 나온다. 이제 #include "algorithm"을 사용해서 문자열 길이를 기준으로 sort를 사용해보려고 한다. 앞서서 Sort 함수에 대해서 간략하게 소개해 보려고 한다. Sort함수는 C++의 알고리즘 헤더 안에 포함되어 있는데 기본적으로 배열의 시작점과 끝점을 sort()안에 넣어주면 오름차순으로 깔끔하게 정리가 됩니다. 하지만 이 케이스의 경우에는 비교해야 하는것이 길이이기 때문에 그에 맞춰서 조건문을 bool 형태로 만들어서 세 번째 요소로 안에 넣으면 이에 맞춰서 정렬이 동작합니다. 자세한 설명을 보고 싶으신 분은 Sort_Algorithm_Basic의 블로그를 보시면 참고하시기 좋습니다. 아래의 코드는 이제 단어를 기준으로 분류에 성공한 코드입니다. 하지만 정답 코드에서는 중복을 삭제해 주어야 해서 그에 대한 고민을 이후에 하였습니다.
# include "iostream"
# include "algorithm"
using namespace std;
class hello{
public:
string name;
int lenOfName;
};
bool compare (hello a, hello b){
if (a.lenOfName != b.lenOfName){
return a.lenOfName < b.lenOfName;
}
else{
return a.name < b.name;
}
}
int main(void){
int N;
hello arr[10000];
cin >> N;
for (int i = 0; i < N; i++){
cin >> arr[i].name;
arr[i].lenOfName = arr[i].name.length();
}
sort(arr, arr + N, compare);
for (int i = 0; i < N; i++){
cout << arr[i].name << arr[i].lenOfName << "\n";
}
return 0;
}
이미 정렬된 코드였기 때문에 중복된다면 같은 것이 연속으로 나온다는 아이디어를 토대로 코드를 수정하여서 완성하였다. 아 참고로 배열의 크기가 작아서 자꾸 OutofBounds에러가 나와서 그냥 시원하게 30000개 넣어서 완성하였다.
# include "iostream"
# include "algorithm"
using namespace std;
class hello{
public:
string name;
int lenOfName;
};
bool compare (hello a, hello b){
if (a.lenOfName != b.lenOfName){
return a.lenOfName < b.lenOfName;
}
else{
return a.name < b.name;
}
};
int main(void){
int N;
hello arr[25000];
cin >> N;
for (int i = 0; i < N; i++){
cin >> arr[i].name;
arr[i].lenOfName = arr[i].name.length();
}
sort(arr, arr + N, compare);
for (int i = 0; i < N; i++){
if (arr[i].name != arr[i + 1].name)
cout << arr[i].name << "\n";
}
return 0;
}