본문 바로가기

코딩테스트/백준

백준 : 5635번 생일 (JAVA)

목차

    JAVA 풀이 5635번 생일

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

    문제

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

    입력

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

    출력

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

    예제 입력1

    5
    Mickey 1 10 1991
    Alice 30 12 1990
    Tom 15 8 1993
    Jerry 18 9 1990
    Garfield 20 9 1990

    예제 출력1

    Tom
    Jerry

     


    풀이 (리팩토링 전)

    import java.io.*;
    import java.util.*;
    
    public class Main {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		
    		int studentNum = Integer.parseInt(br.readLine());
    		String[][] student = new String[studentNum][2];
    		
    		for(int i = 0; i < studentNum; i++) {
    			String[] info = br.readLine().split(" ");
    			student[i][0] = info[0];
    			if(Integer.parseInt(info[2]) < 10) {
    				info[2] = 0 + info[2];
    			}
    			if(Integer.parseInt(info[1]) < 10) {
    				info[1] = 0 + info[1];
    			}
    			student[i][1] = info[3] + info[2] + info[1];
    		}
    		
    		Arrays.sort(student, (o1, o2) -> {
    			return Integer.compare(Integer.parseInt(o1[1]), Integer.parseInt(o2[1]));
    		});
    		
    		String youngest = student[studentNum - 1][0];
    		String oldest = student[0][0];
    		
    		System.out.println(youngest);
    		System.out.println(oldest);
    	}
    }

     

    수정할 생각으로 정답 목적 막 작성한 코드

     

    1. 2차원 배열을 생성

    2. 이름과 생년월일을 저장

    3. 생년월일 기준으로 오름차순 정렬

    4. 막내(배열의 맨 뒤), 첫째(배열의 맨 앞)을 출력


    풀이 (리팩토링 후)

    import java.io.*;
    import java.util.*;
    
    class Student {
    	String name;
    	int year, month, day;
    	
    	public Student(String name, int year, int month, int day) {
    		this.name = name;
    		this.year = year;
    		this.month = month;
    		this.day = day;
    	}
    	
    	public int getBirthDate() {
    		return year * 10000 + month * 100 + day;
    	}
    }
    	
    public class Main {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		
    		int studentNum = Integer.parseInt(br.readLine());
    		Student[] students = new Student[studentNum];
    		
    		for(int i = 0; i < studentNum; i++) {
    			String[] info = br.readLine().split(" ");
    			String name = info[0];
    			int year = Integer.parseInt(info[3]);
    			int month = Integer.parseInt(info[2]);
    			int day = Integer.parseInt(info[1]);
    			
    			students[i] = new Student(name, year, month, day);
    		}
    		
    		Arrays.sort(students, Comparator.comparingInt(Student::getBirthDate));
    		
    		Student youngest = students[studentNum - 1];
    		Student oldest = students[0];
    		
    		System.out.println(youngest.name);
    		System.out.println(oldest.name);
    	}
    }

     

    2차원 배열 대신 Student 클래스를 만들어 학생 정보를 저장하였다.

     

    생년월일을 정수형으로 표현

    public int getBirthDate() {
    	return year * 10000 + month * 100 + day;
    }

    year 4자리 수, month 2자리 수, day 2자리

    배열 정렬

    Arrays.sort(students, Comparator.comparingInt(Student::getBirthDate));

    앞서 생년월일을 정수형으로 표현한 메서드를 가지고 배열을 정렬한다.