1181: 단어 정렬

wnajsldkf·2022년 11월 10일
0

Algorithm

목록 보기
12/58
post-thumbnail

설명

  • 중복을 제거하기 위해 linkedHashSet으로 저장한다.
  • 중복이 제거된 단어들을 linkedHashSet의 크기만큼 반복하여 저장한다.
  • 저장된 단어들은 정렬 조건을 따라 정렬한다.
    정렬조건: 길이가 짧은 것부터, 길이가 같으면 사전 순으로
    • 글자수가 길이가 같은 경우: compareTo로 문자열을 비교한다.
    • 글자수가 다른 경우: 두 단어를 서로 swap 한다.

코드

public class P1181 {
	static int N;
    static String[] wordArray;
    
    public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        N = Integer.parseInt(st.nextToken());
        
        LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
        
        for (int i = 0; i < N; i++) {
        	st = new StringTokenizer(br.readLine());
            linkedHashSet.add(st.nextToken());
		}
        
        wordArray = linkedHashSet.toArray(new String[]{});
        
        for(int i = 0; i < wordArray.length; i++){
        	// 옆자리와 비교하면서 정렬하기 때문에
        	for(int j = i+1; j < wordArray.length; j++){
            	// 글자수 길이가 같은 경우
            	if(wordArray[i].length() == wordArray[j].length()) {
                	// wordArray[j]가 사전순으로 앞에 있다.
                	if(wordArray[i].compareTo(wordArray[j]) > 0) {
                    	String tmp = wordArray[i];
                        wordArray[i] = wordArray[j];
                        wordArray[j] = tmp;
					}
                    // 글자수 길이로 비교할 수 있는 경우
				} else if (wordArray[i].length() > wordArray[j].length()) {
                	String tmp = wordArray[i];
                    wordArray[i] = wordArray[j];
                    wordArray[j] = tmp;
				}
			}
		{
        
        for (int i = 0; i < wordArray.length; i++) {
        	System.out.println(wordArray[i]);
		}
	}
}    

+) Comparator를 사용한다면 좀더 깔끔하게 코드를 작성할 수 있을 것이다.
참고: https://st-lab.tistory.com/112
Comparator는 객체를 비교할 수 있도록 해주는 인터페이스로, 자바에서 제공하는 자료형 외에 직접 사용자 클래스를 만들어 비교하거나, 특정 규칙에 의해 비교하고 싶은 경우 유용하게 사용할 수 있다.

String[] arr = new String[N];	// 배열에 단어가 이미 초기화 되었다고 가정한다.
Arrays.sort(arr, new Comparator<String>() {
	// 비교 방법을 작성한다.
	@Override
	public int compare(String s1, String s2) {
    	// 단어 길이가 같을 경우
        if(s1.length() == s2.length()) {
        	// 사전 순 정렬, 양수가 반환되면 정렬 알고리즘에 의해 값이 바뀐다. 
        	return s1. compareTo(s2);	
		}
        // 그 외의 경우 -> 단어 길이 순으로 정렬한다.
        else {
	        // 양수가 반환되면 정렬 알고리즘에 의해 값이 바뀔 것이다. 
        	return s1.length() - s2.length();	
    }
});    
profile
https://mywnajsldkf.tistory.com -> 이사 중

0개의 댓글