BOJ 문제풀이

백준 10816번 c++ 풀이

koreasunoo 2021. 8. 6. 22:40

안녕하세요 오늘은 이분탐색으로 풀면 빨리 풀리는 문제를 풀어보겠습니다. (다른 방식으로 푼 저는 엄청난 메모리와 시간을 맛봤지요 맞긴했지만..)

두가지 방법으로 문제를 풀어보겠습니다만, 2번째 방법을 추천드립니다.

 

전략1

1. 범위를 확인한 후, 20000001길이의 벡터를 선언해준다(어레이로 선언하면 배열 길이 제한때문에 안된다)

2. x+= 10000000을 해준후, x+1번째 배열의 원소 값에 1을 더해준다.

3. 2번째 입력때 x+= 10000000을 해준다음 그 위치에 있는 원소값을 출력한다.

 

코드1(내가 한 번에 풀었던 방식):

#include <bits/stdc++.h>
#include <vector>
using namespace std;
int main(){
	vector<int> arr(20000001);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int N;
	cin>>N;
	for(int i= 0; i<N; i++){
		int x;
		cin>>x;
		x+=10000000;
		arr[x] += 1;
	}
	int M;
	cin>>M;
	for(int i= 0; i<M; i++){
		int x; 
		cin>>x;
		x+=10000000;
		cout<<arr[x]<<" ";
	}
}

 

전략2: 

1. N을 입력받은 후에 길이가 N인 v라는 벡터를 선언하고 입력을 받고 sort함수를 통해 정렬을 해준다.

2. M값을 입력받고 그 값이 길이인 answer라는 벡터를 선언해주고 값을 받고 그 값을 upper_bound을 통해 뒤에서 부터 그 값을 찾은 위치를 upper라는 변수로 두고, 똑같이 앞에서부터 탐색하여 lower라는 값에 선언해준다.

3. upper-lower를 통해 그 값의 개수를 출력해준다.

코드2(문제에서 주어진 알고리즘 분류인 이분탐색으로 풀이한 코드):

#include <bits/stdc++.h>
#include <vector>
using namespace std;
int main() {
	ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int N, M;
    cin >> N;
    vector<int> v(N);
    for (int i = 0; i < N; i++)
        cin>>v[i];
    sort(v.begin(), v.end());
    cin >> M;
    for (int i = 0; i < M; i++) {
        int K;
        cin >> K;
        auto upper = upper_bound(v.begin(), v.end(), K);
        auto lower = lower_bound(v.begin(), v.end(), K);
       	int answer = upper - lower;
		cout<<answer<<" ";
    }
}

 

 

'BOJ 문제풀이' 카테고리의 다른 글

백준 11866번 c++ 풀이  (0) 2021.08.06
백준 9184번 c++ 풀이  (0) 2021.08.06
백준 10828번 c++ 풀이  (0) 2021.08.06
백준 10866번 c++ 풀이  (0) 2021.08.06
백준 2164번 c++ 풀이  (0) 2021.08.06