코딩테스트/C++

[백준 BOJ] 27172번 - 수 나누기 게임 (C++)

최-코드 2024. 2. 3. 22:53

27172번: 수 나누기 게임 (acmicpc.net)

 

27172번: 수 나누기 게임

《보드게임컵》을 준비하다 지친 은하는 보드게임컵 참가자들을 경기장에 몰아넣고 결투를 시키는 게임 《수 나누기 게임》을 만들었습니다. 《수 나누기 게임》의 규칙은 다음과 같습니다.

www.acmicpc.net

처음 수부터 끝 수까지 차례대로 약수를 구한 다음 구한 약수에 대해 카드가 존재한다면 점수를 주는 방식으로 구현해봤다. 다른 사람들의 코드를 보니 해당 카드의 배수로 접근해 그 배수의 값을 가진 카드가 있는지 찾는 코드였다. 이 방식이 더 깔끔해보였다.

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
#include <cmath>
#define ll long long
#define pii pair<int,int>
#define endl '\n'

using namespace std; 

int N;
int num[100000];
bool chek[1000001];
int ans[1000001];
set<int> s;

int main() {
	cin>>N;
	int tmp;
	for(int i = 0; i<N; i++)
	{
		cin>>num[i];
		chek[num[i]]=true;
	}
	for(int i=0; i<N; i++)
	{
		for(int j = 1; j<=sqrt(num[i]); j++)
		{
			if(num[i]%j==0)
			{
				s.insert(j);
				if(j!=num[i]/j&&num[i]!=num[i]/j)
					s.insert(num[i]/j);
			}
		}
		for(auto a : s)
		{
			if(chek[a])
			{
				ans[a]++;
				ans[num[i]]--;
			}
		}
		s.clear();
	}
	for(int i = 0; i<N; i++)
	{
		cout<<ans[num[i]]<<" ";
	}
	return 0;
}