본문 바로가기
IT/알고리즘(Algorithm)

[JAVA]백준 1181번 문제 풀이

by 공부하는개미 2022. 11. 22.

# 문제 출제 사이트

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

 

1181번: 단어 정렬

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

www.acmicpc.net

 

# 문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

 

# 입력

첫째 줄에 단어의 개수 N이 주어진다.

(1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다.

주어지는 문자열의 길이는 50을 넘지 않는다.

 

# 출력

조건에 따라 정렬하여 단어들을 출력한다.

단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.

 

 

# 제출한 소스코드

더보기

1. 글자수에 맞게 정렬되고 중복은 제거 되었지만, 길이가 같으면 사전순으로 정렬해야하는데 못한 것

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedHashSet;
import java.util.List;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());


    String[] strArr = new String[n];
    int[] numArr = new int[n];
    for ( int i = 0; i < n; i++ ) {
      String tempStr = br.readLine();
      strArr[i] = tempStr;
      numArr[i] = tempStr.length();
    }

    for ( int j = 0; j < n; j++ ) {
      for ( int k = 0; k < n; k++ ) {
        if ( numArr[j] < numArr[k] ) {
          int tempNum = numArr[k];
          numArr[k] = numArr[j];
          numArr[j] = tempNum;
          
          String tempStr = strArr[k];
          strArr[k] = strArr[j];
          strArr[j] = tempStr;
        }
      }
    }
    
    LinkedHashSet<String> hashSet = new LinkedHashSet<>(List.of(strArr));
    for ( String str : hashSet ) {
       System.out.println(str);
    }
  }
}
  • 1시간 가량 고민하다가 결국 제출했는데 글자수에 맞게 정렬하고 중복도 제거했지만 하나의 조건을 못 맞췄다.
  • 결국 오늘도 Stranger's LAB 블로그를 보고 아래의 방식대로 문제를 풀게 되었다.

 

 

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

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] = br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
        @Override
        public int compare(String str1, String str2) {
    
            if ( str1.length() == str2.length() ) {
                return str1.compareTo(str2);
            } else {
                return str1.length() - str2.length();
            }
        }
    });
    
    LinkedHashSet<String> hashSet = new LinkedHashSet<>(List.of(strArr));
    for ( String str : hashSet ) {
       System.out.println(str);
    }
  }
}
  • Arrays.sort 에 Compare 함수를 Override 해서 사용할 방법은 진짜 생각도 못했다.
    * Stranger's LAB의 블로그를 보고 해당 코드를 작성했다.
  • 위 코드는 LinkedHashSet을 사용해서 중복된 글자를 제거했다.
    • HashSet을 사용해서 중복을 제거할려고 했지만 순서가 뒤바뀌었다.
      => HashSet과 LinkedHashSet의 차이점 => 링크

 

 

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));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] = br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
        @Override
        public int compare(String str1, String str2) {
    
            if ( str1.length() == str2.length() ) {
                return str1.compareTo(str2);
            } else {
                return str1.length() - str2.length();
            }
        }
    });


    System.out.println(strArr[0]);
    for ( int j = 1; j < strArr.length; j++ ) {
      
      if ( !(strArr[j].equals(strArr[j - 1])) ) {
          System.out.println(strArr[j]);
      }
    }
  }
}
  • 굳이 LinkedHashSet 을 사용해서 정렬할 필요가 없었다.
    j 인덱스의 글자와 j - 1 인덱스의 글자가 같으면 출력을 안하면 되는 것이었다.

 

 

# 참고자료

  • 블로그 Stranger's LAB => 링크
반응형