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를 통해 다른 두 자료형을 한번에 저장할 수 있다.
위 예시 처럼 작성하면, 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함수 첫번째 인자로 넣어주면 중복된 값들이 모두 사라지게 된다.
'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 |