[Java] 참가자 명단 #23056

이동엽·2022년 7월 21일
0

코딩테스트

목록 보기
7/9

participants list #23056

문제 원본 링크

코드 보러 가기


백준 : 충남대학교 대회

  • 제 5회 생객하는 프로그래밍 대회 A번

문제 설명

백남이의 모교인 백준고등학교에서 체육대회를 개최하려 한다.

체육대회는 1부터 NN까지의 학급만 참여하며, 각 학급당 최대 MM명까지 선착순으로 참가할 수 있다.

  • 단, NN은 짝수이다.

또한, 체육대회의 팀을 학급이 홀수일 때 청팀, 짝수일 때 백팀으로 나누기로 했다.


이에 따라 백남이는 체육대회 참가자 명단 프로그램을 제작하려 한다.

  • 청팀을 먼저, 백팀을 나중에 출력한다.
  • 각각의 팀에 대해 학급을 오름차순으로 출력한다.
  • 각각의 학급에 대해 학생의 이름을 길이가 짧은 것부터, 길이가 같다면 사전 순으로 출력한다.

입력 조건

  1. 첫째 줄에 학급 수인 NN과 학급당 신청 가능한 인원수 MM이 주어진다.

    • (NN은 짝수이고, 2N102\leq N \leq 10, 1M101\leq M \leq 10)
  2. 둘째 줄부터 신청된 순서대로 학생의 학급과 이름이 주어진다.

    • 학생의 학급은 NN을 초과하지 않는다. 이름은 모두 소문자이며 15자를 초과하지 않는다.
  3. 학급과 이름이 동일한 학생은 존재하지 않는다.

  4. 신청할 수 있는 최대 학생 수는 500명이다.

  5. 입력의 마지막은 0 0으로 나타낸다.


출력 조건

첫째 줄부터 체육대회 참가자 명단 프로그램에 맞게 학생의 학급과 이름을 공백으로 구분하여 출력한다.



문제 접근 방식

  • Participants 클래스를 만들고, 필드로 반 번호와 이름을 가짐.
    • Comparable 인터페이스를 구현하여 compareTo 메소드로 정렬 방식을 지정
      • 학급 번호는 오름차순으로, 이름은 길이에 따라 짧은 순으로 정렬
  • Main 클래스에는 odd, even 배열 리스트를 생성하여 학급을 관리
    • 입력 값은 split() 메소드를 이용해 구분하여 받았다.
    • Collections.sort() 메소드를 통해 객체를 정렬
    • printList() 메소드를 이용해 리스트를 출력하였다.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
    private static ArrayList<Participants> odd = new ArrayList<>(); //홀수 학급
    private static ArrayList<Participants> even = new ArrayList<>(); //짝수 학급
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {
//        System.out.println("학급 수 N과 학급당 최대 인원수 M을 입력");
        String[] str = br.readLine().split(" ");

        int N = Integer.parseInt(str[0]);
        int M = Integer.parseInt(str[1]);

        int[] school = new int[N + 1];

        boolean isEOF = false;
        do {
//            System.out.println("학급과 이름을 입력하세요");
            String[] input = br.readLine().split(" ");

            int classNumber = Integer.parseInt(input[0]);
            String name = input[1];

            if (classNumber == 0 && name.equals("0")) {
                isEOF = true;
                continue;  //break;
            }

            if (classNumber % 2 == 0 && school[classNumber] < M) {
                even.add(new Participants(classNumber, name));
                school[classNumber]++;
            } else if (classNumber % 2 == 1 && school[classNumber] < M) {
                odd.add(new Participants(classNumber, name));
                school[classNumber]++;
            }
        } while (!isEOF);

        Collections.sort(odd);
        Collections.sort(even);

        printList(odd);
        printList(even);
    }

    private static void printList(ArrayList<Participants> list) {
//        StringBuilder sb = new StringBuilder();
//
//        for (int i = 0; i < list.size(); i++) {
//            sb.append(list.get(i).classNumber + " " + list.get(i).name + "\n");
//        }
//
//        System.out.println(sb.toString());
        for (Participants p : list) {
            System.out.println(p.classNumber + " " + p.name);
        }
    }
}

class Participants implements Comparable<Participants> {
    int classNumber;
    String name;

    Participants(int classNumber, String name) {
        this.classNumber = classNumber;
        this.name = name;
    }

    @Override
    public int compareTo(Participants o) {
        if (this.classNumber == o.classNumber) {
            if (this.name.length() == o.name.length()) {
                return this.name.compareTo(o.name);
            }
            return this.name.length() - o.name.length();
        }
        return this.classNumber - o.classNumber;
    }
}
profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

0개의 댓글