728x90
반응형
2024.06.17기준 - 실버5
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 정렬과 조건문을 활용해서 대회 참가자 수와 이름을 나열하는 문제입니다.
저의 접근은
1. 3가지 조건에 맞는 참가자의 APC점수와 이름을 저장하는 커스텀 클래스를 생성했습니다.
// 3가지 조건을 만족하는 사람들의 이름과 APC점수를 저장하는 클래스
public static class Member {
String name;
int APCrank;
public Member(String n, int a) {
name = n;
APCrank = a;
}
}
2. 입력받은 참가자 정보를 이용해 3가지 조건에 맞는지 확인한 후 맞다면 list에 저장했습니다.
while (n-- > 0) {
st = new StringTokenizer(br.readLine());
name = st.nextToken(); // 이름
attendance = st.nextToken(); // 재학 여부
premier = st.nextToken(); // ICPC 수상 여부
srank = Integer.parseInt(st.nextToken()); // shake! 최고 성적
arank = Integer.parseInt(st.nextToken()); // APC 성적
// 3가지 조건에 만족하는 사람들만 저장한다.
if (attendance.equals("jaehak") && premier.equals("notyet") && (srank == -1 || srank > 3)) {
list.add(new Member(name, arank));
}
}
3. 만약 저장된 참가자가 10명이 넘는다면 10까지만 참가할 수 있기 때문에 10명이 넘는 낮은 점수 참가자를 제외했습니다.
// 3가지 조건을 만족하는 사람이 10명이 넘으면 APC점수로 나열해서 10명만 선정
if (list.size() > 10) {
Collections.sort(list, (o1, o2) -> o1.APCrank - o2.APCrank);
int removeNum = list.size() - 10;
while (removeNum-- > 0) {
list.remove(10);
}
}
4. 이렇게 선정된 인원의 이름을 사전순으로 정렬한 뒤 출력해 주었습니다.
// 이름을 사전순으로 정렬
Collections.sort(list, (o1, o2) -> o1.name.compareTo(o2.name));
sb.append(list.size()).append("\n"); // 총 참가자 수
for (Member m : list) {
sb.append(m.name).append("\n");
}
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
// 3가지 조건을 만족하는 사람들의 이름과 APC점수를 저장하는 클래스
public static class Member {
String name;
int APCrank;
public Member(String n, int a) {
name = n;
APCrank = a;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine()); // 참가자의 수
List<Member> list = new LinkedList<>(); // 3가지 조건을 만족하는 사람들을 저장하는 리스트
StringTokenizer st;
String name, attendance, premier;
int srank, arank;
while (n-- > 0) {
st = new StringTokenizer(br.readLine());
name = st.nextToken(); // 이름
attendance = st.nextToken(); // 재학 여부
premier = st.nextToken(); // ICPC 수상 여부
srank = Integer.parseInt(st.nextToken()); // shake! 최고 성적
arank = Integer.parseInt(st.nextToken()); // APC 성적
// 3가지 조건에 만족하는 사람들만 저장한다.
if (attendance.equals("jaehak") && premier.equals("notyet") && (srank == -1 || srank > 3)) {
list.add(new Member(name, arank));
}
}
// 3가지 조건을 만족하는 사람이 10명이 넘으면 APC점수로 나열해서 10명만 선정
if (list.size() > 10) {
Collections.sort(list, (o1, o2) -> o1.APCrank - o2.APCrank);
int removeNum = list.size() - 10;
while (removeNum-- > 0) {
list.remove(10);
}
}
// 이름을 사전순으로 정렬
Collections.sort(list, (o1, o2) -> o1.name.compareTo(o2.name));
sb.append(list.size()).append("\n"); // 총 참가자 수
for (Member m : list) {
sb.append(m.name).append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 31909번 FOCUS (0) | 2024.06.19 |
---|---|
BAEKJOON / 백준 - JAVA 31908번 커플링 매치 (0) | 2024.06.18 |
BAEKJOON / 백준 - JAVA 31924번 현대모비스 특별상의 주인공은? 2 (0) | 2024.06.16 |
BAEKJOON / 백준 - JAVA 31883번 FA수의 진 (2) | 2024.06.14 |
BAEKJOON / 백준 - JAVA 31884번 Stacking Sticks (0) | 2024.06.12 |