본문 바로가기
백준

[백준] 10814번 - 나이순 정렬

by 템닉___ 2024. 7. 3.

문제: 

시도 횟수: 1번 + GPT

처음 생각한 방법: 처음 생각한 방식으로는 getline으로 받아와서 분리할까 싶었었는데, 입력을 두번 받는 for문이 더 구현이 간단할 것 같았다. 그래서 pair를 떠올렸고, 이 pair들을 나중에 정렬 후 출력해야하기 때문에 vector에 넣어서 관리해줘야한다는 생각이 들었습니다.
그래서 나이순 정렬까지는 어떻게 했는데.. 가입순 정렬을 어떻게해야하는지 감이 전혀 잡히지 않았습니다.
그래서 GPT의 도움을 살짝 빌렸습니다.

람다 함수를 사용해서 문제를 풀어주더군요. 아니 그보다 sort의 세번째 매개변수인 compare 함수를 까먹고 있었습니다.
어떻게 정렬할지 커스텀하려면 세번째 매개변수를 추가했어야했는데 말이죠.

아무튼 그렇게 두 pair들을 비교해서 만약 나이가 같다면 정렬 안하고 넘어가는 함수를 커스텀해주었습니다.
커스텀할때 함수를 따로 빼는 방법과, 람다함수 사용하는 두가지 방법이 있더군요.
람다함수를 빠르게 공부해서 자주 사용해봐야겠다 싶을정도로 람다함수가 간편했습니다.

다음은 GPT가 해준 설명입니다.

C++ 람다 함수는 익명 함수로서, 함수를 정의하고 그 자리에서 사용할 수 있는 간편한 방법을 제공합니다. 주로 함수 객체(함수 포인터)를 필요로 하는 곳에서 사용됩니다.
람다 함수의 구조
람다 함수는 다음과 같은 기본 구조를 가집니다:
[capture clause] (parameter list) -> return type { function body }
Capture clause: 외부 변수를 람다 함수 내에서 사용할 때, 그 변수를 어떻게 가져올지를 정의합니다.
Parameter list: 함수의 매개변수를 나열합니다.
Return type: 함수의 반환 타입을 명시합니다. 반환하지 않는 경우 -> void로 명시하거나 생략할 수 있습니다.
Function body: 함수의 실제 동작을 정의합니다.
람다 함수 사용 설명
1. 람다 함수 정의: sort 함수의 세 번째 인자로 람다 함수를 전달합니다. 이 람다 함수는 두 개의 pair<int, string>을 매개변수로 받습니다.
2. Capture clause: 예시 코드에서는 외부 변수를 캡처하지 않았습니다. 외부 변수를 캡처하는 방법은 [&] 또는 [=]과 같은 형태로 표기합니다. [&]는 참조를 통해 변수를 캡처하고, [=]는 복사를 통해 변수를 캡처합니다.
3. Parameter list: const pair<int, string>& a와 const pair<int, string>& b는 각각 비교할 두 개의 요소를 나타냅니다. const는 함수 내에서 변수를 수정하지 않겠다는 의미입니다.
4. Return type: bool 타입으로 명시되어 있습니다. 이 람다 함수는 pair<int, string>을 비교하여 작은 값을 반환합니다.
5. Function body: if-else 문을 사용하여 나이가 같은 경우에는 입력 순서를 유지하도록 조건을 설정했습니다.
람다 함수의 장점
간편성: 코드의 일부분을 간결하게 작성할 수 있습니다.
지역성: 람다 함수는 정의된 지점에서만 유효하기 때문에, 지역 변수나 외부 함수의 변수를 직접적으로 사용할 수 있습니다.
재사용성: 한 번만 사용할 함수를 별도로 정의할 필요 없이 바로 사용할 수 있습니다.
람다 함수는 특히 STL 알고리즘과 함께 사용될 때 유용하며, 코드의 가독성을 높이고 작성하는 데 편리함을 제공합니다.


내 코드:

#include <bits/stdc++.h>
using namespace std;
int main() {
    int N,age;
    string name;
    pair<int, string> p;
    vector<pair<int, string>> vec;
    cin >> N;
    
    for(int i=0; i<N;i++) {
        cin >> age;
        cin >> name;  
        p.first=age;
        p.second=name;
        vec.push_back(p);
    }
    sort(vec.begin(), vec.end());
    for(auto i:vec) {
        cout << i.first << ' ' << i.second << endl;
    }
    
    return 0;
}

모범답안:

// with GPT
#include <bits/stdc++.h>
using namespace std;
int main() {
    int N,age;
    string name;
    pair<int, string> p;
    vector<pair<int, string>> vec;
    cin >> N;
    
    for(int i=0; i<N;i++) {
        cin >> age;
        cin >> name;  
        p.first=age;
        p.second=name;
        vec.push_back(p);
    }
    sort(vec.begin(), vec.end(), [](const pair<int, string>& a, const pair<int, string>& b) {
        if (a.first != b.first) {
            return a.first < b.first;
        } else {
            return false;
        }
    });
    for(auto i:vec) {
        cout << i.first << ' ' << i.second << endl;
    }
    
    return 0;
}

내 코드의 개선할 점: Sort함수의 세번째 매개변수 기억하기. 람다함수 공부해서 적용해보기

알고리즘 분류: Unclassified

난이도: 실버 V

복습하면서 참고해본 블로그 목록:  
https://breakcoding.tistory.com/117

 

[C++] vector (벡터) 정렬, 배열 정렬하기

벡터든 배열이든 정렬을 하려면 라이브러리의 sort() 함수를 쓰면 된다. 따라서 헤더파일을 포함해줘야 한다. sort() 함수의 첫번째 두번째 매개변수는 iterator, 즉 포인터이다. sort - C++ Reference custom

breakcoding.tistory.com

https://ya-ya.tistory.com/91

 

[C++ STL]pair 클래스 사용방법

안녕하세요. 오늘은 알아두면 유용한 C++의 Pair 클래스를 소개해겠습니다. 1. pair 클래스 Pair 클래스는 사용자가 지정한 2개의 타입의 데이터를 저장하는데 사용합니다. 서로 연관된 2개의 데이터

ya-ya.tistory.com

 

'백준' 카테고리의 다른 글

[백준] 2609번 - 최대공약수와 최소공배수  (0) 2024.03.29
[백준] 2839번 - 설탕배달  (0) 2024.03.29
[백준] 1157번 - 단어 공부  (1) 2024.03.26
[백준] 10250번 - ACM 호텔  (0) 2024.03.22
[백준] 2920번 - 음계  (1) 2024.03.22