본문 바로가기

Coding

[C++]백준 10816번: 숫자 카드 2

728x90
문제

https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

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

www.acmicpc.net

문제이해

  1. 처음 입력으로 N(1 ≤ N ≤ 500,000)이 주어지고 N번 동안 상근이 카드를 입력합니다.
  2. 다음 입력으로 M(1 ≤ M ≤ 500,000)이 주어지고 M번 동안 확인할 카드를 입력합니다.
  3. 출력으로 확인할 카드들을 상근이가 얼마나 가지고 있는지 확인하여 출력합니다.
문제해결

숫자 카드에 적혀있는 수의 범위가 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같은 상황에서 상근이가 가지고 있는 카드의 값들을 저장하기 위해 크기가 20,000,001인 벡터를 만들어야 합니다. 이 벡터의 인덱스 0부터 9,999,999까지는 음수를 나타내는 용도로 사용되며, 인덱스 10,000,000은 0을 나타내는 용도로 사용되고, 인덱스 10,000,001부터 20,000,000까지는 양수를 나타내는 용도로 사용됩니다.

예를 들어, 예제 입력 1에서 -10이 2개 있으므로 vector[9,999,990]의 값을 2로 설정하고, 10이 3개 있으므로 vector[10,000,010]의 값을 3으로 설정합니다. 이후에 M개의 수를 처리할 때는 해당 수를 인덱스로 사용하여 vector에서 값을 불러오면 됩니다.

예를 들어, 3의 갯수를 찾기 위해서는 vector[10,000,003]의 값을 가져오면 됩니다. 이렇게 벡터를 사용하여 상근이가 가지고 있는 각 숫자의 갯수를 저장하고 필요할 때 값을 불러올 수 있습니다.

 


#include <iostream>
#include <vector>
using namespace std;

vector<int> table(20000001);

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int N, input;
	cin >> N;
	for (int i{ 1 }; i <= N; i++) {
		cin >> input;
		if (input > 0) {
			table[input + 10000000]++;
		}
		else if (input == 0) {
			table[10000000]++;
		}
		else {
			table[10000000 + input]++;
		}
	}
	cin >> N;
	for (int i{ 1 }; i <= N; i++) {
		cin >> input;
		if (input > 0) {
			cout << table[input + 10000000] << " ";
		}
		else if (input == 0) {
			cout << table[10000000] << " ";
		}
		else {
			cout << table[10000000 + input] << " ";
		}
	}
}

문제후기

조금만 생각하면 간단하게 해결되는 문제였던 것 같습니다.

728x90

'Coding' 카테고리의 다른 글

[C++]백준 1182번: 부분수열의 합  (0) 2023.07.09
[C++]백준 2644번: 촌수계산  (0) 2023.07.08
[C++]백준 14891번: 톱니바퀴  (0) 2023.07.06
[C++]백준 2579번: 계단 오르기  (0) 2023.07.05
[C++]백준 2485번: 가로수  (0) 2023.07.05