[백준] 2870. 수학숙제

1 분 소요

문제 링크

[백준] 2870. 수학숙제


풀이 과정

정규식과 Pattern, Matcher 를 사용해 문제를 해결했습니다.


Pattern pattern = Pattern.compile("[\\d]+");

숫자만 사용된 부분 문자열을 찾기 위한 정규식 pattern 을 생성합니다.


while (N-- > 0) {
    String input = br.readLine();
    Matcher matcher = pattern.matcher(input);

    while (matcher.find()) {
        String num = matcher.group().replaceAll("^0+", "");
        numbers.add(num.length() == 0 ? "0" : num);
    }
}

위 과정은 각 줄에서 숫자를 모두 찾아 리스트 numbers 에 담는 동작을 수행합니다. 아래와 같은 과정을 거칩니다.

  1. N 번을 돌며 문자열을 입력받습니다.
  2. 입력받은 문자열로 matcher 객체를 만든 뒤, find 메소드를 호출해 문자열 내 모든 숫자를 찾습니다.
  3. 숫자가 존재한다면, group 메소드를 통해 해당 부분 문자열에서 0으로 시작하는 숫자들을 모두 제거합니다. 예를 들어, 문자열 내에서 찾은 숫자가 00030 이라면 앞에 0을 떼어내 30 으로 만듭니다.
  4. 가공된 숫자를 리스트에 담습니다. 이 때, 숫자가 0 혹은 00 과 같이 다 제거해서 빈 문자열이 되는 경우, 리스트에는 0을 넣어줍니다.


numbers.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length();
    }
});

리스트에 담긴 문자열 형태를 띄는 숫자들오름차순으로 정렬해줍니다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
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));
        int N = Integer.parseInt(br.readLine());
        ArrayList<String> numbers = new ArrayList<>();
        Pattern pattern = Pattern.compile("[\\d]+");

        while (N-- > 0) {
            String input = br.readLine();
            Matcher matcher = pattern.matcher(input);

            while (matcher.find()) {
                String num = matcher.group().replaceAll("^0+", "");
                numbers.add(num.length() == 0 ? "0" : num);
            }
        }

        numbers.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length();
            }
        });

        StringBuilder sb = new StringBuilder();
        for(String num : numbers) sb.append(num + "\n");

        System.out.println(sb);
    }
}

카테고리:

업데이트:

댓글남기기