[백준/C++] 10816번 숫자 카드 2
2021. 2. 1. 16:09ㆍ카테고리 없음
728x90
반응형
문제: www.acmicpc.net/problem/10816
10816번: 숫자 카드 2
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
문제풀이
숫자카드에 적혀있는 숫자의 범위가 -10,000,000 ~ 10,000,000 으로 0 포함 20,000,001 의 크기의 int형 배열을 선언했을 때 80,000,008 바이트 약 80 MB의 메모리를 사용하게 되는데 문제의 메모리 제한은 256 MB로 넉넉하기 때문에 배열의 인덱스를 이용하여 문제를 풀었다.
배열 arr[20000001] 을 0으로 초기화시키고 상근이가 가지고 있는 숫자카드라면(해당 숫자의 입력이 들어온다면) 1을 더해주어 숫자카드의 개수를 저장한다.
배열의 인덱스는 음수일 수 없기 때문에 -1 ~ -10,000,000 의 수는 10,000,001 ~ 20,000,000 로 나타내었다.
코드
#include <iostream>
using namespace std;
int main(){
ios::sync_with_stdio(false); cin.tie(NULL);
int N;
cin>>N;
int numN;
int arr[20000001] = {0,};
for(int i=0; i<N; i++){
cin>>numN;
numN >= 0 ? arr[numN]++:arr[10000000-numN]++; //음수라면 10000001~20000000에 저장한다
}
int M;
cin>>M;
while(M--){
int numM;
cin>>numM;
if(numM >= 0){ //인덱스를 이용한 숫자 갯수 출력
cout<<arr[numM]<<" ";
}
else{
cout<<arr[10000000-numM]<<" ";
}
}
return 0;
}
결과
다른 풀이를 보니 이진 탐색(upper_bound, lower_bound)을 이용한 풀이도 있었습니다.
이진 탐색을 사용하면 -10,000,000 ~ 10,000,000 의 숫자를 모두 인덱싱할 필요 없어
낭비되는 메모리가 없어 낮은 공간 복잡도로 풀이가 가능합니다.
728x90
반응형