Algorithm/BOJ

[백준] #1181 단어 정렬

jHoon0223 2022. 8. 1. 22:48

https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

실버5로 어려운 문제는 아니지만 아주 오랜만에 백준을 풀면서 기록해둘것이 좀 많아 쓰게 되었다.


  • 풀이

풀이방식은 간단하다. int와 string을 쓰는 pair형 vector에 단어 길이와 단어를 입력받고 정렬한 뒤, 중복제거를 해주고 출력해주면 끝이다.


  • 구현
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void) {
    int N;
    cin >> N;
    
    vector<pair<int, string>> v;
    while(N-->0) {
        string s;
        
        cin >> s;
        v.push_back(make_pair(s.length(), s));
    }
    
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(),v.end()), v.end());
    
    for (int i = 0; i < v.size(); i++)
        cout << v[i].second << '\n';
    
    return 0;
}

이 부분에서 기록할 것은 vector의 pair형 표현과 중복제거인데, 먼저 vector의 pair형 표현을 보자.

  • vector의 pair형 표현

vector는 다른 여러 자료형을 저장할 수 있지만, pair를 통해 다른 두 자료형을 한번에 저장할 수 있다.

vector 구현
출력

위 예시 처럼 작성하면, int와 string을 동시에 저장할 수 있는 pair형 vector가 만들어지게 된다. 이때, 주의할 점은, push_back 사용시에 make_pair로 pair 자료형으로 만든뒤에 저장해야 한다는 것이다.

 

  • vector 인덱스 중복제거

vector에 저장된 값들 중, 중복되는 값을 제거해주는 코드이다. 단 한줄이면 되니 앞으로 종종 애용하도록 하자.

먼저 아무렇게 저장된 vector를 sort함수로 정렬해준다. (#include <algorithm> 필수) 이후 unique와 erase를 이용하여 중복된 값을 제거한다.

unique : 중복된 원소를 vector의 제일 뒷부분으로 보내버림 (쓰레기값 처리) unique 함수의 reture값은 vector 내부 쓰레기값의 첫번째 위치.
erase : 지정해둔 범위 내의 vector 인덱스 모두 삭제. vector size도 줄어듦.

이렇게 unique 함수로 중복된 값을 찾아 맨 뒤로 보내버린뒤에, return된 포인트 값을 erase함수 첫번째 인자로 넣어주면 중복된 값들이 모두 사라지게 된다.


728x90

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] #2903 중앙 이동 알고리즘  (0) 2023.10.26
[BOJ] #18870 좌표 압축  (0) 2023.10.26
[백준] #1946 신입사원  (0) 2021.09.28
[백준] #16953 A → B  (0) 2021.08.23
[백준] #12904 A와 B  (0) 2021.08.22