본문 바로가기

TEAM STUDY/알고리즘 코딩 테스트 스터디

8회차 - 공약수 게임

728x90
반응형

평소 모든 게임을 다 잘하는 예인이는 게임의 여왕으로 불린다. 하지만 이번 MT에서 똑똑한 수정이가 준비한 게임은 수학적인 아이디어를 요구하기 때문에 애를 먹고 있다. 수정이가 준비한 게임은 아래와 같은 규칙으로 진행된다.

  • 게임을 하는 참가자는 가장 먼저 자연수가 적힌 카드 N개를 받는다.
  • 참가자는 자신이 원하는 횟수만큼 아래의 동작을 반복할 수 있다.
  • 게임이 종료될 때 각 사람은 자신이 들고있는 카드들에 적힌 숫자들 전부의 최대공약수 만큼 점수를 획득한다.

 

 예인이는 제한 시간동안 마구잡이로 여러 방법을 시도해보고 있지만, 자신이 얻은 점수가 높은 점수인지 확신을 할 수 가 없었다. 예인이를 도와서 처음에 주어진 숫자 카드를 통해 얻을 수 있는 최고의 점수를 계산하는 프로그램을 작성해주자.

 

입력 형식

  첫 줄에는 처음에 주어지는 숫자 카드의 수 N이 주어진다. N은 1이상 100이하의 자연수이다. 

 두 번째 줄에는 총 N개의 카드에 적혀있는 숫자가 주어진다. 처음 카드에 적혀있는 숫자는 100만이하의 자연수이다.

 

출력 형식

 예인이가 얻을 수 있는 최대의 점수를 한 줄에 자연수로 출력한다.

 

문제 출처

  • Croatian Open Competition in Informatics 2009/2010, Contest #4, Problem #3

 

import java.io.*;
import java.lang.*;
import java.util.*;


public class Main {
	public static final Scanner scanner = new Scanner(System.in);
	public static final int MAX_VALUE = 1000000;


	/**
	 * 게임의 규칙을 만족하면서 만들 수 있는 가장 큰 최대공약수를 반환하는 함수
	 *
	 * @param n         주어진 카드의 수
	 * @param cards     각 카드에 적힌 숫자 배열
	 * @return
	 */
	public static int getMaximumGCD(int n, int[] cards)
	{

		int answer = 1;
		int[] frequency = new int[MAX_VALUE+1];
		
		// 소인수분해를 한다. 
		for(int C : cards){ // 모든 카드에 대해
			ArrayList<Long> factors = MathUtil.factorize(C); // 소인수 분해
			
			// 모든 소인수에 대해
			for(long f : factors){
				frequency[(int)f] += 1;
			}
		}

		for( int i = 2; i <= MAX_VALUE; i += 1){
			// 모든 소인수 i 에 대해
			// 어차피 소인수 아니면 빈도수 0일꺼라 skip
			if(frequency[i] == 0){
				continue;
			}
			
			int count = frequency[i] / n;
			answer *= MathUtil.powInt(i, count);
		}
		return answer;
	}

	public static void main(String[] args) throws Exception {
		int n = scanner.nextInt();
		int[] cards = new int[n];
		for(int i = 0 ; i < n ; i++)
		{
			cards[i] = scanner.nextInt();
		}

		int answer = getMaximumGCD(n, cards);

		System.out.println(answer);
	}

}

class MathUtil{
	/**
	 *
	 * @param N
	 * @return
	 */
	public static ArrayList<Long> factorize(long N) // 최몇
	{
		ArrayList<Long> factors = new ArrayList<>();
		
		for( long div = 2; div * div <= N; div += 1){
			while(N % div == 0){
				factors.add(div);
				N /= div;
			}
		}
		if( N > 1 ){
			factors.add(N);
		}
		return factors;
	}


	/**
	 * 두 정수 a, n에 대해 a ^ n을 계산해주는 함수
	 *
	 * @param a
	 * @param n
	 * @return
	 */
	public static int powInt(int a, int n)
	{
		int result = 1;
		for( int i = 0; i < n; i++ ){
			result *= a;
		}
		return result;
	}
}
728x90
반응형

'TEAM STUDY > 알고리즘 코딩 테스트 스터디' 카테고리의 다른 글

7회차 - 수열의 순환 (+)  (0) 2022.08.01
8회차 - 배열 흔들기 (+)  (0) 2022.08.01
8회차 - 골드바흐의 추측  (0) 2022.07.23
8회차 - 카잉 달력  (0) 2022.07.23
8회차 - 배열 흔들기  (0) 2022.07.23