[백준] 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 에 담는 동작을 수행합니다. 아래와 같은 과정을 거칩니다.
- N 번을 돌며 문자열을 입력받습니다.
- 입력받은 문자열로 matcher 객체를 만든 뒤, find 메소드를 호출해 문자열 내 모든 숫자를 찾습니다.
- 숫자가 존재한다면, group 메소드를 통해 해당 부분 문자열에서 0으로 시작하는 숫자들을 모두 제거합니다. 예를 들어, 문자열 내에서 찾은 숫자가 00030 이라면 앞에 0을 떼어내 30 으로 만듭니다.
- 가공된 숫자를 리스트에 담습니다. 이 때, 숫자가 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);
}
}
댓글남기기