지구정복

[정렬] 백준 - 나이순 정렬 본문

데이터 엔지니어링 정복/Algorithm

[정렬] 백준 - 나이순 정렬

nooh._.jl 2021. 7. 26. 21:29
728x90
반응형

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

 

10814번: 나이순 정렬

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

www.acmicpc.net

 

-문제해설

먼저 자바로는 사용자 클래스를 정의하고 Arrays.sort 익명함수를 이용해서 사용자 객체를 정렬했다.

사용자 객체의 필드값으로는 나이, 이름, 회원가입한 순서 3가지가 있고

익명함수를 재정의할 때는 나이가 같은 경우 회원가입순서를 오름차순으로 정렬하고 

그 외에는 나이를 오름차순 정렬한다.

 

파이썬에서는 리스트를 이용해서 풀어봤다.

자바에서도 배열로 풀면 훨씬 성능이 좋을 것 같다.

리스트 풀이 경우 빈 리스트를 만들고 나이가 리스트의 인덱스값, 이름이 해당 인덱스의 값으로 들어간다.

예를 들어 21 Jonh 인 경우

arr[21] = 'John' 처럼 들어간다.

 

이때 맨 처음 빈 리스트의 크기를 나이의 최대값인 200이 허용되도록 201크기로 초기화해줘야 한다.

 

근데 파이썬 맨 처음 풀이는 성능이 별로 좋지않아서 백준에서 성능 좋은 코드를 참고해서 한 번 더 풀어봤다.

 

 

-자바

package sort;

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

public class BJ10814 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt( br.readLine() );
		StringTokenizer st;
		AgeName[] an = new AgeName[n];
		
		for( int i=0; i<n; i++ ) {
			st = new StringTokenizer( br.readLine() );
			an[i] = new AgeName( Integer.parseInt( st.nextToken() ), st.nextToken(), i );
		}
		Arrays.sort( an, new Comparator<AgeName>() {
			@Override
			public int compare(AgeName o1, AgeName o2) {
				if( o1.age == o2.age ) return o1.num - o2.num;
				return o1.age-o2.age;
			}
		});
		
		StringBuffer sb = new StringBuffer();
		for( int i=0; i<n; i++ ) sb.append( an[i].age + " " + an[i].name + "\n" );
		System.out.println( sb );
	}
}

class AgeName {
	int age;
	String name;
	int num;
	
	public AgeName(int age, String name, int num) {
		this.age = age;
		this.name = name;
		this.num = num;
	}
}

 

 

-파이썬( 리스트 이용 )

n = int(input())
arr = [ [] for _ in range( 201 ) ]

for i in range( n ):
    a, b = input().split()
    arr[int(a)].append( b )
    
for i in range( len(arr) ):
    if arr[i] != []:
        for j in range( len(arr[i]) ): print( i, arr[i][j] )

 

 

-파이썬( lens0022 님 코드 참고 )

from sys import stdin, stdout

arr = [ [] for _ in range( 201 ) ]

for line in stdin.read().splitlines(True)[1:]:
    arr[ int( line.split()[0] ) ].append( line )
    
stdout.write( ''.join( ''.join( u ) for u in arr ) )
728x90
반응형
Comments