알고리즘/정렬

[백준] 1181 : 단어 정렬

믕비 2023. 4. 3. 16:28
반응형

어떻게 풀면 좋을지 고민하다 제한해둔 시간이 지나서 답을 찾아보았다.

sort메서드의 compare 함수를 재정의 하여 내가 원하는대로 정렬할 수 있는 방법이 있었다.

 

1등 코드

메모리 : 18252 KB

시간 : 164 ms

코드길이 : 2755 B

 

내 코드

메모리 : 25700 KB

시간 : 328 ms

코드길이 : 898 B

 

 

[상위 코드] - 1등과의 차이가 꽤 남 ( 21260 KB, 244 ms, 1103 B )

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		try {
			int N = Integer.parseInt(br.readLine());
			ArrayList<ArrayList<String>> lengthMemo = new ArrayList<>();
			for(int i = 0 ; i <= 50 ; i++) {
				lengthMemo.add(new ArrayList<String>());
			}
			
			for(int i = 0 ; i < N ; i++) {
				String line = br.readLine();
				lengthMemo.get(line.length()).add(line);
			}
			for(int i = 1 ; i <= 50 ; i++) {
				lengthMemo.get(i).sort(null);
				String prev = "";
				for(int j = 0 ; j < lengthMemo.get(i).size() ; j++) {
					if(lengthMemo.get(i).get(j).equals(prev)) continue;
					bw.write(prev = lengthMemo.get(i).get(j));
					bw.newLine();
				}
			}
			bw.flush();
			
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

}

 

[내 코드]

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

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		String[] arr = new String[N];
		
		for(int n = 0; n < N; n++) {
			arr[n] = br.readLine();
		}
		
		Arrays.sort(arr, new Comparator<String>() {
			public int compare(String str1, String str2) {
				if(str1.length() == str2.length()) //길이가 같으면 알파벳 비교
					return str1.compareTo(str2); //아스키코드 값이 더 작은 문자열이 앞에 정렬
				else
					return str1.length() - str2.length(); //길이가 더 짧은 문자열이 앞에 정렬
			}
		});
		
		//동일한 문자열 제거
		sb.append(arr[0]).append('\n');
		for(int i = 1; i < N; i++) {
			if(!(arr[i].equals(arr[i-1]))) // 같지 않으면
				sb.append(arr[i]).append('\n'); //삽입
		}
		
		System.out.println(sb);
		

	}

}
반응형

'알고리즘 > 정렬' 카테고리의 다른 글

[백준] 1931 : 회의실 배정 (JAVA)  (0) 2025.04.28
[백준] 10815 : 숫자카드  (0) 2023.04.03
[백준] 11399 : ATM  (0) 2023.04.01