[백준] 10814. 나이순 정렬

진예·2023년 10월 17일
0

Baekjoon : JAVA

목록 보기
32/76
post-thumbnail
post-custom-banner

📌 문제

[10814] 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

⬇️ 입력

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.

⬆️ 출력

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

💡 코드

나이와 이름String 타입 2차원 배열 arr[][]에 저장한 후, Arrays.sort(arr)Compatator 인터페이스를 사용하여 정렬을 수행한다. 기본적으로 나이가 적은 순으로 정렬해야 하므로 String 타입으로 저장된 나이를 Integer.ParseInt(arr[0])를 통해 정수로 변환하여 비교를 수행한다. 나이가 같은 경우에는 먼저 가입한 순으로 정렬해야 하는데, 이는 곧 입력 순이므로 따로 조건을 명시하지 않아도 자동으로 입력 순으로 정렬된다.

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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		String[][] arr = new String[n][2];
		for(int i=0;i<n;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			arr[i][0] = st.nextToken();
			arr[i][1] = st.nextToken();
		}
		
		Arrays.sort(arr, new Comparator<String[]>() {
			@Override
			public int compare(String[] o1, String[] o2) {
				return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
			}
		});
		
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<n;i++) {
			sb.append(arr[i][0] + " " + arr[i][1]).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}

다른 사람의 코드 1 : 내 풀이보다 시간이 훨씬 적게 걸린 코드를 보니 2차원 배열 대신 나이, 이름을 저장할 수 있는 클래스를 생성하여 해당 클래스 객체를 1차원 배열에 담아 정렬하는 방법이 있었다! 답을 맞추고 코드 길이를 줄이는 것도 중요하지만 가장 중요한 성능을 위해 메서드나 클래스를 따로 빼서 풀 수 있도록 좀 더 다양한 코드들을 보며 연습해야 할 것 같다,,

import java.io.*;
import java.util.*;
public class Main {
	
	public static class Member { // 클래스 생성
		int age;
		String name;
		
		public Member(int age, String name) { // 생성자
			super();
			this.age = age;
			this.name = name;
		}

		@Override
		public String toString() {
			return age + " " + name;
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		Member[] member = new Member[n];
		
		for(int i=0;i<n;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int age = Integer.parseInt(st.nextToken());
			String name = st.nextToken();
			member[i] = new Member(age, name);
		}
		
		Arrays.sort(member, new Comparator<Member>() {
			@Override
			public int compare(Member o1, Member o2) {
				return o1.age - o2.age;
			}
		});
		
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<n;i++) {
			sb.append(member[i]).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}

다른 사람의 코드 2 : Arrays.sort() 안에서 Compatator 인터페이스를 구현하는 것이 아니라, Member 클래스 자체에서 Comparable 인터페이스를 구현하는 방법도 있다! 클래스에서 구현하는 경우 Comparator 인터페이스를 구현하면 오류가 발생하므로 Comparable 인터페이스를 구현해야 한다!

import java.io.*;
import java.util.*;
public class Main {
	
	static class Member implements Comparable<Member> {
		int age;
		String name;
		
		public Member(int age, String name) { // 생성자
			super();
			this.age = age;
			this.name = name;
		}

		@Override
		public int compareTo(Member o) {
			return this.age - o.age;
		}

		@Override
		public String toString() {
			return age + " " + name;
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		Member[] member = new Member[n];
		
		for(int i=0;i<n;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int age = Integer.parseInt(st.nextToken());
			String name = st.nextToken();
			member[i] = new Member(age, name);
		}
		
		Arrays.sort(member);
		
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<n;i++) {
			sb.append(member[i]).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}

profile
백엔드 개발자👩🏻‍💻가 되고 싶다
post-custom-banner

0개의 댓글