지구정복

[정렬] 백준 - 단어 정렬 본문

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

[정렬] 백준 - 단어 정렬

nooh._.jl 2021. 7. 25. 13:15
728x90
반응형

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 

-문제해설

처음에 중복제거하고 데이터 추가하려고 HashSet도 사용하고 일일이 이중 반복문 돌면서 길이짧은 거 비교하고 같으면 사전순 비교하고 했는데 너무 비효율적이고 하드코딩이라 노답이었다..

 

예전에 사용자객체 정렬 배웠던 기억이 있어서 처음에 사용자 객체만들고 Comparator객체 이용해서 풀었는데 시간이 엄청 오래 걸렸다. 단순하게 생각해보니깐 그냥 사용자객체 만들지 않고 익명함수 이용해서 할 수 있었다.

 

두 번째가 더 효율이 좋은 코드이다.

 

 

-자바( 사용자 객체 정렬 이용 - 시간 오래 걸림, 비효율적 )

package sort;

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

public class BJ1181 {
	private static int n;
	private static ArrayList<String> t = new ArrayList<String>();
	private static ArrayList<SortStr> al = new ArrayList<SortStr>();
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt( br.readLine() );
		
		for( int i=0; i<n; i++ ) {
			String tmp = br.readLine();
			if( !t.contains( tmp ) ) {
				t.add( tmp );
				al.add( new SortStr( tmp.length(), tmp ) );
			}
		}
		SortStr[] ss = (SortStr[])al.toArray( new SortStr[ al.size() ] );
		Arrays.sort( ss, SortStr.strCom );
		Arrays.sort( ss, SortStr.lenCom );
		
		for( int i=0; i<ss.length; i++ ) System.out.println( ss[i].str );	
	}
}

class SortStr {
	int len;
	String str;
	
	public SortStr(int len, String str) {
		this.len = len;
		this.str = str;
	}

	public static Comparator<SortStr> strCom = new Comparator<SortStr>() {
		@Override
		public int compare(SortStr o1, SortStr o2) {
			return o1.str.compareTo( o2.str );
		}
	};
	
	public static Comparator<SortStr> lenCom = new Comparator<SortStr>() {
		@Override
		public int compare(SortStr o1, SortStr o2) {
			return o1.len - o2.len;
		}
	};
}

 

-자바( 바로 익명함수 이용해서 Comparator 객체 compare메소드 오버라이딩하기 - 시간 적게 걸림, 효율적 )

package sort;

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

public class BJ1181_1 {
	private static int n;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt( br.readLine() );
		
		String[] arr = new String[n];
		for( int i=0; i<n; i++ ) arr[i] = br.readLine();
		
		Arrays.sort( arr, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				if( o1.length()==o2.length() ) return o1.compareTo(o2);
				else return o1.length() - o2.length();
			}
		});
		
		System.out.println( arr[0] );
		for( int i=1; i<n; i++ ) {
			if( !arr[i].equals( arr[i-1] ) ) System.out.println( arr[i] );
		}
	}
}

 

 

-파이썬

import sys
n = int( input() )
tmp = set()
for i in range( n ):
    tmp.add( input() )
    
arr = list(tmp)
arr.sort( key=len )
print( "\n".join( arr ) )
728x90
반응형
Comments