해당 값의 인덱스 위치를 출력하는 find() 함수를 썼을 때 시간초과가 났다. 
find() 함수는 순차탐색 하니까 시간복잡도가 O(N) 이다. 
이미 정렬된 곳에서 탐색하는 거니까 이진 탐색으로 구현된 lower_bound() 를 쓰니까 시간초과가 나지 않았다. 
 

시간복잡도를 비교해보자. 

 
find() O(N)
sort  O(N logN)
 

이진 탐색으로 구현된 lower_bound(), upper_bound()

 lower_bound()  O(log N)
처음 n값이 나오는 위치 반환 
 
upper_bound()  O(log N)
처음으로 n값을 초과하는 위치 반환 
“맞았습니다" 코드 링크
#include <bits/stdc++.h>
using namespace std;

int n, num;
vector<int> v;
vector<int> temp;

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  for(int i = 0; i <n; i++) {
    cin >> num;
    v.push_back(num); temp.push_back(num);
  }
  sort(v.begin(), v.end()); // [-10, -9, 2, 4, 4]
  v.erase(unique(v.begin(), v.end()), v.end()); // [-10, -9, 2, 4]

  for(auto x : temp){
    cout << lower_bound(v.begin(), v.end(), x) - v.begin() << ' ';
  }

  return 0;
}
 
 
728x90

'알고리즘 > 백준' 카테고리의 다른 글

막대기 백준 1094번 c++  (0) 2022.02.17
수들의 합 백준 1789번 c++  (0) 2022.02.16
수 정렬하기 2 백준 2751번 c++  (0) 2022.02.16
마인크래프트 백준 18111번 c++  (0) 2022.02.14
방 번호 백준 1475번 c++  (0) 2022.02.14

+ Recent posts