8회차 - 공약수 게임

2022. 7. 23. 12:37·TEAM STUDY/알고리즘 코딩 테스트 스터디
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
'TEAM STUDY/알고리즘 코딩 테스트 스터디' 카테고리의 다른 글
  • 7회차 - 수열의 순환 (+)
  • 8회차 - 배열 흔들기 (+)
  • 8회차 - 골드바흐의 추측
  • 8회차 - 카잉 달력
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (932) N
      • 개발중 (634) N
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (87)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18) N
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BackendDevelopment
    파이썬
    jpa
    리눅스 마스터 1급
    네트워크 관리사 요약
    리눅스 마스터 1급 요약
    리눅스 1급 요약
    알고리즘
    네트워크 관리사 2급 실기
    스프링
    리눅스 마스터 요약
    redis
    쿠버네티스 스터디
    파이썬 알고리즘
    쿠버네티스
    네트워크 관리사 자격증
    리눅스 마스터
    리눅스 마스터 1급 정리
    네트워크 관리사 2급
    네트워크 관리사
    springboot
    네트워크 관리사 학점
    Git 저장소
    REST API
    docker
    git
    java
    VUE
    Spring
    네트워크 관리사 실기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
8회차 - 공약수 게임
상단으로

티스토리툴바