문제/백준

백준 23056번 참가자 명단 [JAVA]

javaju 2021. 10. 17. 18:21

https://www.acmicpc.net/problem/23056

 

23056번: 참가자 명단

첫째 줄에 학급 수인 $N$과 학급당 신청 가능한 인원수 $M$이 주어진다. ($N$은 짝수이고 $2\leq N \leq 10$, $1\leq M \leq 10$) 둘째 줄부터 신청된 순서대로 학생의 학급과 이름이 주어진다. 학생의 학급은

www.acmicpc.net

 

풀이 방법

N개의 학급에 최대 M명까지 선착순으로 참가할 수 있는 참가자 명단을 출력하는 문제였습니다.

 

  • 청팀 -> 백팀 순으로 출력
  • 학급 오름차순
  • 이름의 길이가 짧은 것부터, 사전 순으로

위에 3가지 조건을 만족시켜 참가자 명단을 출력해주면 됩니다.

 

저는 청팀과 백팀을 따로 저장하기 위해 odd, even 리스트를 이용하여 최대 M명까지 넣고 정렬을 한 뒤, 각각 출력해주었습니다.

 

코드

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
75
76
77
78
79
80
81
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
 
public class Main_BJ_23056_참가자명단 {
    
    public static class info implements Comparable<info>{
        int num;
        String name;
        
        public info(int num, String name) {
            super();
            this.num = num;
            this.name = name;
        }
 
        @Override
        public int compareTo(info o) {
            if(this.num==o.num) {
                if(this.name.length()==o.name.length()) return this.name.compareTo(o.name);
                return this.name.length() - o.name.length();
            }
            return this.num-o.num;
        }
 
    }
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        
        ArrayList<info> odd = new ArrayList<>(); //홀
        ArrayList<info> even = new ArrayList<>(); //짝
        
        
        st = new StringTokenizer(br.readLine());
        
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        
        int [] school = new int[N+1];
        
        
        while(true) {
            st = new StringTokenizer(br.readLine());
            
            int num = Integer.parseInt(st.nextToken());
            String name = st.nextToken();
            
            if(num==0 && name.equals("0")) break;
            
            if(num%2==0 && school[num]<M) {
                even.add(new info(num, name));
                school[num]++;
            }
            else if(num%2==1 && school[num]<M) {
                odd.add(new info(num,name));
                school[num]++;
            }
        }
        
        Collections.sort(odd);
        Collections.sort(even);
        
        for(int i=0;i<odd.size();i++) {
            sb.append(odd.get(i).num+" "+odd.get(i).name+"\n");
        }
        
        for(int i=0;i<even.size();i++) {
            sb.append(even.get(i).num+" "+even.get(i).name+"\n");
        }
        
        System.out.println(sb.toString());
 
    }
 
}
cs