백준 | 10814 : 나이순 정렬 (Java)

usuyn·2021년 9월 11일
0

알고리즘

목록 보기
4/12

문제에 대한 자세한 정보는 백준 | 10814번 : 나이순 정렬에서 확인할 수 있다.


풀이

여러가지 풀이방법이 있다.

class, 객체 사용

  1. User class를 작성한다.
  2. Arrays.sort() 사용을 위해 compareTo 메소드를 작성한다. (입력은 가입한 순서대로 주어지므로 나이순을 기준으로만 정렬하면 된다.)
  3. 배열(length : N)을 생성하고 입력받은 나이와 이름으로 객체를 생성해 배열에 저장한다.
  4. Arrays.sort()를 사용한다.

String 2차원 배열 사용

  1. String[N][2] 2차원 배열을 생성한다.
  2. [i][0]에는 나이를, [i][1]에는 이름을 저장한다.
  3. 정렬을 위한 Arrays.sort() 사용을 위해 익명 클래스로 Comparator를 생성해 compare 함수를 작성한다.
  4. compare 함수를 작성할 때는 문자열로 저장되어 있는 나이를 Integer.valueOf()를 사용해 정수로 변환하여 비교한다.

소스코드

class, 객체 사용

import java.io.*;
import java.util.*;

class User implements Comparable<User> {
	int age;
	String name;

	public User(int age, String name) {
		this.age = age;
		this.name = name;
	}

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

	@Override
	public String toString() {
		return this.age + " " + this.name + "\n";
	}

}

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int n = Integer.valueOf(br.readLine());

		User[] user = new User[n];

		for (int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			user[i] = new User(Integer.valueOf(st.nextToken()), st.nextToken());
		}

		Arrays.sort(user);

		for (int i = 0; i < n; i++) {
			bw.write(user[i].toString());
		}

		br.close();
		bw.close();
	}

}

String 2차원 배열 사용

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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int n = Integer.valueOf(br.readLine());

		String[][] user = new String[n][2];

		for (int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			user[i][0] = st.nextToken();
			user[i][1] = st.nextToken();
		}

		Arrays.sort(user, new Comparator<String[]>() {

			@Override
			public int compare(String[] o1, String[] o2) {
				// TODO Auto-generated method stub
				return Integer.valueOf(o1[0]) - Integer.valueOf(o2[0]);
			}

		});

		for (int i = 0; i < n; i++) {
			bw.write(user[i][0] + " " + user[i][1] + "\n");
		}

		br.close();
		bw.close();
	}
}

메모리, 시간

class, 객체 사용

메모리 : 54380KB
시간 : 632ms

String 2차원 배열 사용

메모리 : 65096KB
시간 : 840ms


풀이 후

위에 작성한 방법말고도 나이는 어차피 200보다 작거나 같은 정수이므로 StringBuilder를 사용해서 2751번 : 수 정렬하기 2와 같은 방법으로 index를 사용해 풀어도 됐었다. 거기까지 생각을 못했다. 문제를 풀기 전에 더 효율적인 풀이 방법은 없는지 더 생각하는 습관을 길러야겠다.

profile
https://select-dev-from.tistory.com 로 이사 중

0개의 댓글