[문제 요약]
- 총 N명의 응시자가 프로그래밍 대회에 참가함
- 여러 라운드 진행하면서 각 라운드에서 1등은 N 점, 2등은 N-1 점 순으로 순차적으로 점수를 얻게 됨
- 각 라운드마다 받은 점수의 함이 가장 높은 사람이 최종 우승하게 됨
- 마지막 라운드 직전까지의 종합 점수가 주어졌을 때, 최종 우승할 가능성 있는 "응시자의 수"를 구하는 프로그램 작성
- 라운드별로 동점자는 없지만, 종합 점수에서는 동점자가 있을 수가 있으며, 또한 "공동 우승자"가 있을 수 있음
[문제 조건]
- 제한 시간 : 전체 테스트 케이스는 5개 이하, 전체 수행 시간은 1초 이내(Java 2초 이내)
- 메모리 사용 제한 : heap, global, static 총계 256MB, stack 1MB
[입력 조건]
- 입력 파일의 첫째 줄에는 테스트 케이스 개수를 나타내는 자연수 T ( 1 <= T <= 5 )
- 각 테스트 케이스의 첫째 줄에는 응시자의 수 N을 나타냄 ( N은 30만 이하의 자연수)
- 각 테스트 케이스의 두 번째 줄에는 각 응시자가 마지막 라운드 전까지 받은 "종합 점수"를 나타나는 N 개의 정수가 공백(빈칸)을 두고 주어짐
- 각 숫자는 200만을 넘지 않은 음이 아닌 정수
[출력 조건]
- 각 테스트 케이스의 답을 순서대로 표준 출력
- 첫 줄에는 "Case # T"를 출력. 이때 T는 테스트 케이스의 번호
- 그다음 줄에는 "최종 우승"할 가능성이 있는 응시자의 수를 출력함
[정답 문제 풀이]
- 한 응시자가 최고점을 받은 후의 점수가, 나머지 응시자 중 가장 높은 점수보다 높으면 최종 우승할 수 있다. 가장 높은 점수가 N 점이니깐 한 응시자의 점수에 + N값이다.
- 나머지 응시자 중 가장 높은 점수를 구해야 한다. 최종 우승하기 위한 조건은 나머지 응시자의 종합 점수가 너무 높으면 안 된다. 그러면 점수가 높은 응시자에게 가장 낮은 점수(1점)를, 낮은 점수를 가진 응시자에게 그다음 높은 점수(N-1 점)를 줘야 가장 적절하다. 부여한 점수 중에 최댓값을 구한 다음에, 한 응시자의 종합 점수 + N 값이 그 최댓값보다 크면 최종 우승할 수 있는 경우가 된다.
- 배열로 응시자들의 점수들을 입력받은 다음, 오름차순으로 정렬한다. 그리고 가장 낮은 점수부터 높은 점수까지 높은 점수에서 낮은 점수를 더하면서 가장 큰 최댓값을 구한다. 다시 응시자의 점수를 오름차순으로 훑으면서 + N 한 점수가 이전에 구한 최댓값보다 크면 count 하여 최종 우승할 가능성이 있는 응시자의 수를 구한다.
[소스 코드]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | /* You should use the statndard input/output in order to receive a score properly. Do not use file input and output Please be very careful. */ import java.util.Arrays; import java.util.Scanner; /* As the name of the class should be Solution , using Solution.java as the filename is recommended. In any case, you can execute your program by running 'java Solution' command. */ class Solution { static int Answer; public static void main(String args[]) throws Exception { /* * The method below means that the program will read from input.txt, instead of * standard(keyboard) input. To test your program, you may save input data in * input.txt file, and call below method to read from the file when using * nextInt() method. You may remove the comment symbols(//) in the below * statement and use it. But before submission, you must remove the freopen * function or rewrite comment symbols(//). */ /* * Make new scanner from standard input System.in, and read data. */ Scanner sc = new Scanner(System.in); // Scanner sc = new Scanner(new FileInputStream("input.txt")); int T = sc.nextInt(); for (int test_case = 0; test_case < T; test_case++) { Answer = 0; ///////////////////////////////////////////////////////////////////////////////////////////// /* * Implement your algorithm here. The answer to the case will be stored in * variable Answer. */ int N = sc.nextInt(); int max = 0, count = 0; int[] score = new int[N]; for (int i = 0; i < N; i++) { score[i] = sc.nextInt(); } Arrays.sort(score); for (int i = 0; i < N; i++) { if ((score[i] + N - i) > max) max = score[i] + N - i; } for (int i = 0; i < N; i++) { if (score[i] + N >= max) count++; } Answer = count; ///////////////////////////////////////////////////////////////////////////////////////////// // Print the answer to standard output(screen). System.out.println("Case #" + (test_case + 1)); System.out.println(Answer); } } } | cs |
[후기]
- 2중 for 문을 이용해서 최댓값을 구한 다음에 바로 for 문을 돌려서 응시자의 수를 구하는 소스를 작성했는데 시간 초과로 오답으로 나왔다. for 문을 분리해서 하니깐 시간이 단축되어서 정답으로 처리되었다.
'Code Practice' 카테고리의 다른 글
[Codeground] 연습문제 - #3. 시험 공부(Java) (0) | 2017.09.04 |
---|---|
[Codeground] 연습문제 - #1. 숫자 골라내기(Java) (0) | 2017.09.02 |