티스토리 뷰

1) 생각

올림픽 종목을 추가하기 위한 투표를 한다. 올림픽 종목과 투표위원회가 각각 주어진다.

올림픽 종목은 재미있는 순서대로 나열되어있고 숫자는 해당 index 올림픽의 개최 비용을 나타낸다.

투표위원회의 주어지는 각각의 숫자는 그 개최비용 이하에 투표한다. 이 때, 가장 재미있는 종목에 투표한다.


처음 생각

각각을 배열로 저장한 뒤 투표위원회에서 하나를 꺼내어 올림픽 종목과 앞에서 부터 비교를 한다.

▶올림픽 종목은 재미순으로 정렬되어 있기 때문에 앞에서부터 비교를 하면서 해당 투표위원회의 비용 이하의 종목이 나오면 결과 배열의 해당 종목의 인덱스를 +1 시켜준 뒤 바로 반복문을 종료한다.


2) 방안

1) 모든 케이스에 대해서 가장 많은 표를 획득한 경기는 1경기만 존재한다.

▶ 조건 문을 처리해 줄 때, =을 사용하지 않아도된다.

▶ 위에서 만들어둔 결과 배열의 인덱스를 탐색하여 가장 수가 높은 해당 인덱스를 +1 하여 출력한다(배열의 Index는 0부터 시작)

▶ 조직위원회가 담겨있는 B 배열은 굳이 배열에 저장할 필요없이 바로 사용해도 무방할 것이다.(이 편이 속도가 더 빠를 것이다)


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Solution{
    static int n,m;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int tc = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i=1;i<=tc;i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken()); // 종목 리스트
            m = Integer.parseInt(st.nextToken()); // 조직 위원회
            int[] A = new int[n];
            int[] B = new int[m];
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<n;j++)
                A[j] = Integer.parseInt(st.nextToken());
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<m;j++)
                B[j] = Integer.parseInt(st.nextToken());
            // 입력 받기 끝
            
            // 해당 종목이 선택된 횟수를 저장할 배열
            int[] resultArr = new int[n];
            
            // B를 앞에서 부터 꺼내고 그 B를 가지고 A의 앞에서부터 작거나 같은게 있나 파악. 발견하면 해당 횟수를 올려주고 반복문 종료후 다음 B 탐색.
            for(int j=0;j<m;j++) {
                int t = B[j];
                for(int k=0;k<n;k++) {
                    if(A[k]<=t) {
                        resultArr[k]++;
                        break;
                    }
                }
            }
            int t = 0;
            int result = 0;
            // 가장 많이 투표를 받은 종목의 번호를 출력해야 하므로 앞에서 부터 resultArr에 저장된 가장 큰 값을 찾는다.
            // 가장 큰 값을 저장해야할 t 변수와 그 떄의 종목의 번호(index)를 가지고 있을 result 변수 생성.
            // 배열은 0부터 시작하고 번호는 1 부터 시작하므로 index+1 을 해주었다.
            for(int j=0;j<n;j++) {
                if(t<resultArr[j]) {
                    t = resultArr[j];
                    result = j+1;
                }
            }
            sb.append("#"+i+" "+result+"\n");
        }
        System.out.println(sb);
    }
}
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday