BOJ. 1181

Opusdeisong·2022년 12월 25일
0

백준 Class2

목록 보기
13/31


#BOJ1181

단어 정렬

아 파이썬으로 풀고 싶다... 이 문제를 시플플로 풀면서 공부할 수 있는 부분이 많을 것 같다. 우선 클래스로 풀어야하나 생각이 든다. 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;
}
profile
Dorsum curvatum facit informaticum.

0개의 댓글