알고리즘 모음(C++)

백준 10816 - 숫자 카드2(C++) 본문

백준

백준 10816 - 숫자 카드2(C++)

공대생의 잡다한 사전 2021. 11. 3. 01:14

문제 링크입니다. https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

간단한 이분 탐색 문제였습니다.

문제 조건
출력 예시

이분 탐색을 통해 해당 숫자가 있는지는 찾은 후, 해당 숫자가 존재한다면 똑같은 카드가 몇개인지를 찾는 문제입니다.

존재하는 것은 찾은뒤 -> for문을 통해서 몇개가 있는지 -> 시간초과가 됩니다.

따라서 중복되는 숫자가 몇개가 있는지를 이분 탐색 전에 확인해야합니다.

 

저는 배열 크기를 10,000,000 + 10,000,000 크기의 배열을 선언한 뒤, 양수는 앞의 10,000,000에 저장하고 음수는 뒤에 저장을 했습니다.

이분 탐색의 기본인 탐색 전 정렬은 꼭 해줘야합니다.

 

문제 접근 방법

1. 카드를 입력받으면서 카드의 수를 저장합니다.

2. 카드를 정렬합니다.

3. 이분 탐색을 통해서 카드의 존재 여부를 확인한 뒤, 존재한다면 갯수를 출력합니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>

using namespace std;

int N, M;
int card[500001];
int num[20000001];

bool binary_search(int x) {
	int low = 0;
	int high = N - 1;
	while (low <= high) {
		int mid = (low + high) / 2;
		if (card[mid] == x) return true;
		else if (card[mid] > x) {
			high = mid - 1;
		}
		else low = mid + 1;
	}
	return false;
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> card[i];
		if (card[i] >= 0) num[card[i]]++;
		else num[-card[i] + 10000000]++;
	}
	sort(card, card + N);
	cin >> M;
	for (int i = 0; i < M; i++) {
		int x;
		cin >> x;
		if (binary_search(x)) {
			if (x >= 0) cout << num[x] << " ";
			else cout << num[-x + 10000000] << " ";
		}
		else {
			cout << "0" << " ";
		}
	}
	return 0;
}

 

 

질문 및 조언 댓글 남겨주세요!

'백준' 카테고리의 다른 글

백준 1436 - 영화감독 숌(C++)  (0) 2021.11.03
백준 10866 - 덱(C++)  (0) 2021.11.03
백준 1806 - 부분합(C++)  (0) 2021.11.02
백준 1644 - 소수의 연속합(C++)  (0) 2021.11.02
백준 12100 - 2048(Easy) (C++, 복습)  (0) 2021.11.02