본문 바로가기
코딩테스트/programming_JAVA

[Java] baekjoon_1181 : 단어 정렬

by prometedor 2023. 12. 25.

Collections.sort or Arrays.sort 이용하기

단어 정렬 : Silver5

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

 

1181번: 단어 정렬

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

www.acmicpc.net

 

 

 

백준 입력받는 부분은 예전에 정리해둔 입력방식을 참고하였다.

https://la-reveuse.tistory.com/2

 

[Java] baekjoon_15552번: BufferReader, BufferWriter

BufferReader로 입력을 받고, BufferWriter로 출력함 - 정의 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out)); 몇 번 반복할 것인지 T로 정의 i

la-reveuse.tistory.com

 

 

처음 작성한 코드

import java.io.*;
import java.util.*;

public class Main {
  public static void main(String[] args) throws Exception {
    
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str = "";
    ArrayList<String> al = new ArrayList<>();
    LinkedHashSet<String> hs = new LinkedHashSet<>();

    while((str = br.readLine()) != null && !str.isEmpty()) {
      StringTokenizer st = new StringTokenizer(str);
      al.add(st.nextToken());
    }

    Collections.sort(al);
    Collections.sort(al, Comparator.comparingInt(String::length));
    
    for (int i = 0; i < al.size(); i++) {
      String s = "";
      for (char ch : al.get(i).toCharArray()) {
        if (ch >= 'a' && ch <= 'z') {
          s += ch;
        }
      }
      if (s.equals(al.get(i))) {
        hs.add(al.get(i));
      }
    }
    
    for (String el : hs) {
        System.out.println(el);
    }
  }
}

 

ㄴ BufferedWriter 를 사용하지 않고 BufferedReader 만 사용

ㄴ Collections.sort(ArrayList 타입 배열) 을 통해 단어를 사전순으로 정렬하고자함

Collections.sort(ArrayList 타입 배열, Comparator.comparingInt(String::length)); 이용하여 문자열 길이에 따라 오름차순 정렬하도록 함

 

두 번째 작성한 코드

import java.io.*;
import java.util.*;

public class Main {
  public static void main(String[] args) throws Exception {
    
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

    LinkedHashSet<String> hs = new LinkedHashSet<>();

    Arrays.sort(str);
    Arrays.sort(str, Comparator.comparingInt(String::length));

    for (int i = 0; i < str.length; i++) {
      String s = "";
      for (char ch : str[i].toCharArray()) {
        if (ch >= 'a' && ch <= 'z') {
          s += ch;
        }
      }
      if (s.equals(str[i])) {
        hs.add(str[i]);
      }
    }
    
    for (String el : hs) {
      bw.write(el);
      bw.newLine();  // 개행 문자 추가
    }

    bw.flush(); // 버퍼 비우기
  }
}

 

ㄴ BufferedWriter 이용하여 출력하기

int n = Integer.parseInt(br.readLine());
String[] str = new String[n];

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

 

ㄴ 입력받는 방식 변경

 


 

문제점 : 백준을 오랜만에 풀어보니 입력 받는 부분까지 내가 작성해야된다는 점이 불편했다. 

해결 방법 : BufferedReader, BufferedWriter 를 함께 이용하여 실행 시간을 단축하였다.

깨달은 바 : 앞으로 백준을 풀 때는 BufferedReader, BufferedWriter 를 사용하도록 해야겠다.