백준 알고리즘 문제(86) - 나이 순 정렬

온라인 회원의 나이와 이름을 오름차순으로 정렬해주는 문제다.
나이가 같다면 입력받은 순서대로 정렬한다.

이전 문제들과 같이 comparator을 활용해서
문자열로 입력받은 나이에 해당하는변수 age를 비교해주고 같을 경우에는 순서에 맞게 출력하도록 해보겠다.

나는 나이를 제외하고는 굳이 순서를 바꿔줄 필요가 없으므로, -1 or 0을 return해주면 입력순으로 나올 것이라고 생각하고 코드를 구상했다. 그리고, 1대1로 직접 비교하거나 문자열을 비교해주는게 아니라 2차원 배열을 비교하므로 람다식을 이용해 풀어냈다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;


public class java_io {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	public static void main(String[] args) throws IOException {
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st;
		
		String[][] arr = new String[N][2];
		for(int i =0; i<N; i++) {
			st = new StringTokenizer(br.readLine()," ");
			String age = st.nextToken();
			String name = st.nextToken();
			
			arr[i][0] = age;
			arr[i][1] = name;
		}
		//같다면 입력 순서대로, 아니라면 오름차순으로
		Arrays.sort(arr, (s1, s2) -> {
				if(s1[0] == s2[0]) {
					return 0;
				} else {
					return Integer.compare(Integer.parseInt(s1[0]), Integer.parseInt(s2[0]));
				}
		});
		
		StringBuilder sb = new StringBuilder();
		for(int i =0; i<N; i++) {
			sb.append(arr[i][0]+" "+arr[i][1]).append('\n');
		}
		
		
		System.out.println(sb);
		}
		
		
	}

이전 포스팅에서 했던 방법들을 내 것으로 만들고 조금만 응용해 틀어줘도 이렇게 바로 풀 수있다.

추가하자면, 이 방법외에도 그냥 comparator을 호출해서 compare 메소드를 사용하는 방법이 있다. Person 클래스를 생성해서 나이와 이름을 입력받아 간편하게 출력하는 형식이다.

두 번째로, 가장 효율이 높은 StringBuilder을 배열로 사용해버리는 방법이다. StringBuilder 자체가 입력을 쌓아두고 한꺼번에 출력하는 방법이기 때문에 메모리 낭비가 적다.
countingsort와 같은 방법을 사용하되, 입력값이 너무 큰 경우에는 메모리 낭비가 생길 수 있으니 조심하도록 해야겠다. 아래는 Stranger's lab에서 클론코딩한 자료다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
 
public class Main {
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		int N = Integer.parseInt(br.readLine());
 
		// 입력되는 나이의 범위 : 1 ~ 200
		StringBuilder[] p = new StringBuilder[201];
		
		for(int i = 0; i < p.length; i++) {
			p[i] = new StringBuilder();
		}
		
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int age = Integer.parseInt(st.nextToken());
			String name = st.nextToken();
			// 카운팅 정렬 : 나이를 index 로 하여 해당 배열에 나이와 이름을 append() 한다
			p[age].append(age).append(' ').append(name).append('\n');
		}
		
		StringBuilder sb = new StringBuilder();
		for(StringBuilder val : p) {
			sb.append(val);
		}
        
		System.out.println(sb);
	}
} //출처 : Stranger's lab

좋은 웹페이지 즐겨찾기