본문 바로가기

백준 문제 풀이

백준 16894번 약수 게임

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

 

16894번: 약수 게임

구사과와 큐브러버는 약수 게임을 하려고 한다. 약수 게임은 종이에 정수를 적으면서 진행하고, 두 사람은 턴을 번갈아 가진다. 가장 처음에 종이에는 정수 N이 적혀있다. 각자의 턴이 돌아올

www.acmicpc.net

1 또는 소수가 주어지면 그 즉시 구사과가 이긴다.

주어진 수가 두 소수의 곱일때 그 수를 a * b(a, b는 소수)라 할 수 있고 이때 구사과는 수를 a 또는 b로 만들어야 하니 큐브러버가 이기게 된다.

위의 경우가 아닐 경우에는 주어진 수는 적어도 3개 이상의 소수의 곱이고 구사과가 두 소수의 곱으로 이루어진 수를 남겨 두번째 경우와 같은 이유로 이기게 된다.

따라서 주어진 수가 몇개의 소수의 곱으로 이루어져 있는지를 알면 답을 구해낼 수 있다.

 

#include<iostream>
using namespace std;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie();
	cout.tie();
//count : 주어진 수를 이루는 소수의 갯수
	long long int N, count = 0;
	cin >> N;
	while (N && count <= 2){
		bool flag = false;
		for (long long int i = 2; i * i <= N; i++){
//N이 i로 나누어지면 break문이 동작하니 2 이상 i 미만인 자연수 중 N의 약수는 없고 i는 소수 입니다.
			if (!(N % i)){
				count++;
				N /= i;
				flag = true;
				break;
			}
		}
		if (N == 1) break;
//N ^ (1 / 2) 이하의 수들로 N이 나누어 떨어지지 않으면 N은 소수 입니다.
		else if (!flag){
			count++;
			break;
		}
	}

	if (count == 0 || count == 1 || count == 3) cout << "koosaga";
	else cout << "cubelover";

	return 0;
}

'백준 문제 풀이' 카테고리의 다른 글

백준 8872번 빌라봉  (0) 2021.03.17
백준 3015번 오아시스 재결합  (0) 2021.03.16
백준 11404번 플로이드  (0) 2021.03.16
백준 1967번 트리의 지름  (0) 2021.03.16
백준 9613번 GCD 합  (0) 2021.03.16