728x90
문제
https://www.acmicpc.net/problem/10816
문제이해
- 처음 입력으로 N(1 ≤ N ≤ 500,000)이 주어지고 N번 동안 상근이 카드를 입력합니다.
- 다음 입력으로 M(1 ≤ M ≤ 500,000)이 주어지고 M번 동안 확인할 카드를 입력합니다.
- 출력으로 확인할 카드들을 상근이가 얼마나 가지고 있는지 확인하여 출력합니다.
문제해결
숫자 카드에 적혀있는 수의 범위가 -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 |