728x90
문제 링크
문제 설명
어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 반에 있는 학생의 수 n이 주어진다. (1 ≤ n ≤ 100)
다음 n개 줄에는 각 학생의 이름과 생일이 "이름 dd mm yyyy"와 같은 형식으로 주어진다. 이름은 그 학생의 이름이며, 최대 15글자로 이루어져 있다. dd mm yyyy는 생일 일, 월, 연도이다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31) 주어지는 생일은 올바른 날짜이며, 연, 월 일은 0으로 시작하지 않는다.
이름이 같거나, 생일이 같은 사람은 없다.
출력
첫째 줄에 가장 나이가 적은 사람의 이름, 둘째 줄에 가장 나이가 많은 사람 이름을 출력한다.
구조화
정렬 문제, 년 월 일 순서로 비교하면서 정렬
내림차순, 오름차순 상관없이 맨앞과 맨뒤 출력
오답 노트
Comparator를 클래스에 정의하고 정렬하는 법을 배우자!
Comparable은 두 개로 비교 안됨
소스 코드 [PriorityQueue 사용]
import java.io.*;
import java.util.*;
public class Main {
public static class Node{
String name;
int day, mon, year;
public Node(String name, int day, int mon, int year) {
this.name = name;
this.day = day;
this.mon = mon;
this.year = year;
}
}
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
PriorityQueue<Node> students = new PriorityQueue<>(new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
if (o1.year == o2.year) {
if (o1.mon == o2.mon) {
return o2.day - o1.day;
}
else {
return o2.mon - o1.mon;
}
}
return o2.year - o1.year;
}
});
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine());
String str = st.nextToken();
int d = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
students.offer(new Node(str, d, m, y));
}
System.out.println(students.peek().name);
for (int i = 0; i < T-1; i++) {
students.poll();
}
System.out.println(students.peek().name);
}
}
메모리: 14148KB
시간: 120ms
소스 코드 [배열 정렬]
import java.io.*;
import java.util.*;
public class Main {
public static class Node{
String name;
int day, mon, year;
public Node(String name, int day, int mon, int year) {
this.name = name;
this.day = day;
this.mon = mon;
this.year = year;
}
}
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
Node[] students = new Node[T];
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine());
String str = st.nextToken();
int d = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
students[i] = new Node(str, d, m, y);
}
Arrays.sort(students, new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
if (o1.year == o2.year) {
if (o1.mon == o2.mon) {
return o2.day - o1.day;
}
else {
return o2.mon - o1.mon;
}
}
return o2.year - o1.year;
}
});
System.out.println(students[0].name);
System.out.println(students[T-1].name);
}
}
메모리: 14076KB
시간: 124ms
'Algorithm > 백준' 카테고리의 다른 글
[백준] 1715 카드 정렬하기 🃏 (Java) (1) | 2024.04.20 |
---|---|
[백준] 11729 하노이 탑 이동 순서 🗼 (Java) (0) | 2024.04.19 |
BOJ 2491 수열 📈📉 (0) | 2024.04.15 |
BOJ 2669 직사각형 네개의 합집합의 면적 구하기 📏 (1) | 2024.04.14 |
BOJ 28278 스택 2 🗑 (0) | 2024.04.12 |