자료구조/문제풀이

[백준 JAVA] 2870 수학숙제

휴먼코딩 2024. 7. 17. 21:15

2870 수학숙제

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

문제설명

정규식을 사용해 숫자를 추출하고 내림차 순으로 정렬

접근방식

O(N log N) collections.sort

 

N개의 줄에서 각 줄(L)마다 숫자를 추출하고 리스트에 저장한다. 

그리고 Collections.sort로 정렬한다. 

Collections.cort는 O(N log N)의 시간 복잡도를 가진다.


문제 조건 분석 과정

  • ArrayList<String>인 numbers에 숫자 저장. 정규 표현식을 사용하여 숫자를 추출한다.
  • '\\d' 로 숫자의 해당하는 패턴을 검사했다. 이 패턴에 맞는 숫자를 찾아 리스트에 저장한다.
  • Collection.sort를 사용하여 numbers 리스트를 정렬한다.
  • 내림차순으로 정렬하기 위해 Comparator을 사용했다.
  • 처음엔 treemap으로 정렬하려고 했으나 오름차순으로 정렬되어 중간에 Comparator로 바꿨다.

사용된 자료구조

  • ArrayList: 숫자를 저장하는 리스트
  • Pattern, Matcher: 정규 표현식을 이용한 숫자 추출
  • Comparator: 매개변수들을 비교하여 내림차순으로 정렬

전체코드

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        ArrayList<String> numbers = new ArrayList<>();

        // 정규 표현식 패턴 설정
        Pattern pattern = Pattern.compile("\\d+");

        int N = Integer.parseInt(br.readLine()); // 종이의 줄의 개수 N

        // 각 줄을 읽어 숫자를 추출하여 리스트에 저장
        for (int i = 0; i < N; i++) {
            String line = br.readLine();
            Matcher matcher = pattern.matcher(line);

            while (matcher.find()) {
                String num = matcher.group().replaceAll("^0+", ""); // 숫자 추출 후 앞의 0 제거
                numbers.add(num.isEmpty() ? "0" : num); // 숫자가 없으면 "0"으로 처리
            }
        }

        // 비내림차순으로 정렬하기
        Collections.sort(numbers, (o1, o2) -> {
            if (o1.length() == o2.length()) { // 길이가 같으면 사전순으로 정렬
                return o1.compareTo(o2);
            } else { // 길이가 다르면 길이가 짧은 순서대로 정렬
                return o1.length() - o2.length();
            }
        });

        // 결과를 StringBuilder에 추가
        for (String num : numbers) {
            sb.append(num).append('\n');
        }

        System.out.print(sb); // 결과 출력

        br.close();
    }
}