본문 바로가기
Algorithm/Baekjoon

Baekjoon 5635 생일 JAVA

by Hunveloper 2022. 8. 3.
728x90

 

5635번: 생일

어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.

www.acmicpc.net

문제

어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 반에 있는 학생의 수 n이 주어진다. (1 ≤ n ≤ 100)

다음 n개 줄에는 각 학생의 이름과 생일이 "이름 dd mm yyyy"와 같은 형식으로 주어진다. 이름은 그 학생의 이름이며, 최대 15글자로 이루어져 있다. dd mm yyyy는 생일 일, 월, 연도이다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31) 주어지는 생일은 올바른 날짜이며, 연, 월 일은 0으로 시작하지 않는다.

이름이 같거나, 생일이 같은 사람은 없다.

출력

첫째 줄에 가장 나이가 적은 사람의 이름, 둘째 줄에 가장 나이가 많은 사람 이름을 출력한다.

풀이

BufferedReader(new InputStreamReader(System.in))을 이용하여 학생들의 정보를 한줄로 입력받고,

StringTokenizer를 이용하여 이름, 일, 월, 년을 구분한다.

새로운 클래스를 만들지 않고, 값을 저장하기 위해서 name의 정보를 인덱스화 시켜서 date에 보관한다.

이렇게 보관된 인덱스는 date 배열이 정렬되더라도 항상 같은 이름을 가르키기 때문에 index 역할을 수행 할 수 있다.

 

arrays.sort lambda식을 이용하여 필요한 인덱스별로 정렬을 3번을 해서 일, 월, 년 순으로 정렬을 하여 기수 정렬과 동일한 알고리즘으로 정렬을 해서 가장 마지막에 오는 사람이 가장 큰 값을 가진다.

 

나이를 계산할때는 값이 클수록 어리기에 가장 어린사람으로, 가장 처음에 위치하는 사람을 나이가 많은 사람으로 출력한다.

코드
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n=Integer.parseInt(br.readLine());
		String [] name = new String[n];
		int [][] date = new int[n][4];
		for(int i=0;i<n;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			name[i]=st.nextToken();
			date[i][0]=i;
			for(int j=1;j<=3;j++)
				date[i][j]=Integer.parseInt(st.nextToken());
		}
		Arrays.sort(date, (o1, o2) -> o1[1]-o2[1]);
		Arrays.sort(date, (o1, o2) -> o1[2]-o2[2]);
		Arrays.sort(date, (o1, o2) -> o1[3]-o2[3]);
		System.out.println(name[date[n-1][0]]+"\n"+name[date[0][0]]);
	}
}

 

728x90
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

Baekjoon 1063 킹 JAVA  (0) 2022.08.06
Baekjoon 9466 텀 프로젝트 JAVA  (0) 2022.08.06
Baekjoon 2693 N번째 큰 수 JAVA  (0) 2022.08.03
Baekjoon 1495 기타리스트 JAVA  (0) 2022.08.02
Baekjoon 10833 사과 JAVA  (0) 2022.08.01

댓글