아이디어
이름의 길이가 상당히 제한적인 것을 보고, 자료구조의 기준을 이름의 길이로 잡아야 겠다는 아이디어를 떠올렸다. if(친구 && 좋은친구)의 기준은 이름의 길이가 같고, 성적의 등수가 K 이하로 나야 하니까, 이름의 길이가 같은 아이들끼리 자료구조에 담아두고, 자료구조에는 그 등수를 담아둔 다음, 정렬을 시킨 뒤, 이진탐색을 하여 좋은 친구의 쌍 수를 구하면 된다.
점검해볼 사항
- 이진탐색의 활용.
- 정렬을 시켜야하는 아이디어.
- 자료구조에 담기는 내용. int, pair
- 슬라이딩 윈도우, deque
시간복잡도
- Nlog(N) (= N만큼을 사용하여 길이를 인덱스로 가진 선형자료구조에 저장 + 20 * logN (길이는 최대 20이고 그 길이마다의 성적차순을 정렬해준다. + NlogN으로 모든 아이들기준으로 K만큼 차이나는 아이들의 쌍을 찾는다.)
https://github.com/jongwuner/Algorithm/blob/master/BOJ/3078.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include<iostream> #include<string> #include<vector> #include<algorithm> #define MAX_LEN 21 using namespace std; typedef long long ll; int main() { ll N, M, ans = 0; vector< vector<ll> > list; scanf("%lld%lld", &N,&M); list.resize(MAX_LEN); for (ll i = 1; i <= N; i++) { string s; cin >> s; list[s.size()].push_back(i); } for (ll i = 1; i <= 20; i++) { sort(list[i].begin(), list[i].end()); for (ll j = 0; j < list[i].size(); j++) { ll idx = upper_bound(list[i].begin() + j, list[i].end(), list[i][j] + M) - (list[i].begin() + j); ans += (idx - 1); } } printf("%lld\n", ans); return 0; } | cs |
'Coding > Algorithm' 카테고리의 다른 글
BOJ(백준) 13119 - Mountains Beyond Mountains (0) | 2019.01.20 |
---|---|
BOJ(백준) 11003 - 최솟값 찾기 (0) | 2019.01.20 |
BOJ(백준) 6416 - 트리인가? (0) | 2019.01.20 |
BOJ(백준) 1949 - 우수마을 (0) | 2019.01.13 |
BOJ(백준) 3482 - Labyrinth (0) | 2019.01.13 |