새소식

PS/백준

[백준/1222] 홍준 프로그래밍 대회 (Python)

  • -

Problem : https://www.acmicpc.net/problem/1222

 

1222번: 홍준 프로그래밍 대회

홍준이는 프로그래밍 대회를 개최했다. 이 대회는 사람들이 팀을 이루어서 참가해야 하며, 팀원의 수는 홍준이가 정해준다. 팀원이 홍준이가 정한 값보다 부족하다면, 그 팀은 대회에 참여할 수

www.acmicpc.net

 

Difficulty : Gold 2

 

Status : Solved

 

Time : 00:23:56

 


 

문제 설명

 

더보기

 

홍준이는 프로그래밍 대회를 개최했다. 이 대회는 사람들이 팀을 이루어서 참가해야 하며, 팀원의 수는 홍준이가 정해준다. 팀원이 홍준이가 정한 값보다 부족하다면, 그 팀은 대회에 참여할 수 없다. 모든 팀은 같은 수의 팀원으로 이루어져 있다.

대회에 참여 의사를 밝힌 학교는 총 N개이다. 각 학교는 모든 학생이 참여할 수 있는 경우에만 대회에 참가한다. 즉, 남는 사람 없이 모든 학생이 팀에 들어갈 수 있어야 한다.

대회는 예선과 본선으로 구성되어 있다. 모든 팀은 같은 학교 소속으로 이루어져 있어야 한다. 예선에서 각 학교 1등팀만 본선에 진출한다. 

홍준이의 대회는 올해가 첫 해이기 때문에, 많은 관심이 필요하다. 따라서, 본선에 참가하는 사람의 수를 최대가 되도록 팀원의 수를 정하려고 한다. 또, 본선이 지루해지는 것을 막기 위해 적어도 두 팀이 본선에 참가할 수 있어야 한다.

홍준이가 팀원을 몇 명으로 정해야 본선에 참가하는 사람의 수가 최대가 되는지 구하는 프로그램을 작성하시오.

 

 

입력 및 출력

 

더보기

입력

 

첫째 줄에 홍준이의 대회에 참여 의사를 밝힌 학교의 수 N (2 ≤ N ≤ 200,000)이 주어진다.
둘째 줄에는 각 학교 학생의 수가 주어진다. 학생의 수는 구간 [1, 2,000,000]에 포함된다.

 

출력

 

첫째 줄에 홍준이의 대회 본선에 참가하는 사람의 수의 최댓값을 출력한다.

 

입력 예시

 

3 1 2 4

 

출력 예시

 

4

 

 


 

풀이

 

면접 준비에 포스팅은 못하고 문제만 풀어놨다가... 오늘에서야 비로소 문제 풀이와 함께 포스팅하게 되었다.

 

어떤 대학이 프로그래밍 대회에 참여할 수 있으려면, 팀 인원이 그 대학의 학생 수의 약수일 때만 가능하다. 즉 전략을 다르게 생각하여, 모든 대학들의 약수의 경우를 카운트하도록 해보자. 모든 대학에 대해 시행한다면, 최대 O(N * sqrt(S))로 줄일 수 있다. (S는 최대 학생 수이다.) 카운터 등을 이용하여 시행한다면 더더욱 시간 효율적으로 접근할 수 있다.

 

모든 과정을 시행하면, 저장된 카운트는 본 대회에 참여 가능한 대학의 수를 의미한다. 모든 대학은 한 팀만이 본선에 참여 가능하므로, 총 참여 가능한 학생의 수는 (참여하는 대학) * (팀원 수)가 된다. 이 경우의 수를 따지는 데에는 O(S)의 시간복잡도가 소요되며, 이 중 최댓값을 출력하기만 하면 된다.

 

 

풀이 코드(pypy3)

from collections import Counter N = int(input()) student_dict = Counter(map(int, input().split())) maxval = max(student_dict.keys()) divisor = [0]*(maxval+1) for key, val in student_dict.items() : for n in range(1, int(key ** 0.5) + 1) : if key % n == 0 : divisor[n] += val if key // n != n : divisor[key // n] += val ans = 0 for i in range(1, maxval+1) : if divisor[i] > 1 : ans = max(ans, divisor[i]*i) print(ans)

 

풀이 완료!

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.