본문 바로가기

코딩테스트/백준

[백준/1181] 단어정렬 - 자바

제가 풀어본 문제를 올리는 것으로 코드가 전혀 완벽하지 않습니다.

태클 걸어주세요.

 

문제

 

이전에 풀지 못했던 문제..

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

이 문제를 배우면서 함께 배웠던 comparator 이걸 알면 어렵지 않게 풀 수 있는 문제였습니다.

 

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

public class Q1181 {
	//단어정렬
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(bf.readLine());
		String[] arr = new String[N];
		
		
		for(int i=0;i<N;i++){
			arr[i] = bf.readLine();
		}
		
		//중복 없애기 위해 set으로 만들었다가 다시 array로 
		Set<String> set = new HashSet<>(Arrays.asList(arr)); 
		arr = set.toArray(new String[0]);
		
		Arrays.sort(arr,new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				if(o1.length()<o2.length()) {//길이가 더 작을경우 
					return -1;
				}else if(o1.length()==o2.length()) { //길이가 같을경우
					return compareString(o1, o2); //String의 비교
				}
				return 1;
			}
		});
		
		
		for(String str:arr) {
			bw.write(str +"\n");
		}
		bw.flush();
		bw.close();
		bf.close();
		
	}
	public static int compareString(String str1,String str2) {
		char[] chrArr1 = str1.toCharArray();
		char[] chrArr2 = str2.toCharArray();
		int len = str1.length(),i=0;
		while(i!=len) {
			if(chrArr1[i] == chrArr2[i]) {
				i++;
			}else if(chrArr1[i] > chrArr2[i]) {
				return 1;
			}else if(chrArr1[i] < chrArr2[i]) {
				return -1;
			}			
		}
		return 0;
		
	}

}

 

코드설명

comparator를 알고 있느냐 아니냐의 문제 인거 같습니다.