티스토리 뷰

728x90

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

 

2870번: 수학숙제

종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다. 각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차순으로 출력해야 한다. 비내림차순은 내림차

www.acmicpc.net

 

문제

상근이는 수학시간에 딴 짓을 하다가 선생님께 걸렸다. 선생님은 상근이에게 이번 주말동안 반성하라며 엄청난 숙제를 내주었다.

선생님이 상근이에게 준 종이에는 숫자와 알파벳 소문자로 되어있는 글자가 N줄있다. 상근이는 여기서 숫자를 모두 찾은 뒤, 이 숫자를 비내림차순으로 정리해야한다. 숫자의 앞에 0이 있는 경우에는 정리하면서 생략할 수 있다.

글자를 살펴보다가 숫자가 나오는 경우에는, 가능한 가장 큰 숫자를 찾아야 한다. 즉, 모든 숫자의 앞과 뒤에 문자가 있거나, 줄의 시작 또는 끝이어야 한다.

예를 들어, 01a2b3456cde478에서 숫자를 찾으면 1, 2, 3456, 478이다.

선생님이 준 종이의 내용이 주어졌을 때, 상근이의 숙제를 대신하는 프로그램을 작성하시오.

입력

첫째 줄에 종이의 줄의 개수 N이 주어진다. (1 ≤ N ≤ 100)

다음 N개의 줄에는 각 줄의 내용이 주어진다. 각 줄은 최대 100글자이고, 항상 알파벳 소문자와 숫자로만 이루어져 있다.

출력

종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다. 각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차순으로 출력해야 한다. 비내림차순은 내림차순의 반대인 경우인데, 다음 수가 앞의 수보다 크거나 같은 경우를 말한다.

 

 

처음엔 String을 long으로 변환하고 정렬하는 방식으로 코드를 작성했었는데,

입력으로 long의 범위를 넘어서는 입력이 주어질 수도 있기 때문에 런타임 에러가 났다.

즉, int나 long이 아닌 String으로 처리해야 한다. (BigInteger 가능)

 

 

먼저 연속된 숫자를 가져오기 위해 정규 표현식 \\d+를 가지는 Pattern을 생성한다.

이 패턴과 입력된 문자열으로 Matcher를 생성하고,

Matcher.find와 Matcher.group을 통해 정규 표현식을 만족하는 문자열 형식의 문자를 가져온다.

이 문자열의 시작에 있는 연속된 0을 제거한다.

제거한 후 문자열이 비어있다면 원래 문자열이 0이었던 것이므로 (0, 00, 000 등) 0을 list에 넣는다. 

문자열이 비어있지 않다면 그 문자열을 바로 list에 넣는다.

 

문자열이 담긴 list를 정렬한다.

문자열을 정렬하면 숫자의 크기 기준이 아닌 문자열의 앞자리수를 비교하기 때문에

(ex: 4567과 99가 있을 때 4567이 더 작다고 판단)

문자열의 길이가 같다면 문자열의 대소를 비교하고, 길이가 다르다면 무조건 길이가 짧은 문자열이 앞으로 오도록 정렬한다.

 

정렬한 문자열을 StringBuilder에 넣은 후 StringBuilder를 출력한다.

 

 

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

public class B_2870 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		ArrayList<String> result = new ArrayList<>();
		
		Pattern pattern = Pattern.compile("\\d+");
		int M = Integer.parseInt(br.readLine());
		
		for(int i=0;i<M;i++) {
			String input = br.readLine();
			Matcher matcher = pattern.matcher(input);
			
			while(matcher.find()) {
				String num = matcher.group().replaceAll("^0+", "");
				result.add(num.length() == 0 ? "0" : num);
			}
		}
		
		result.sort((o1, o2) -> o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length());
		for(String s : result)
			sb.append(s).append('\n');
		
		System.out.println(sb);
		
		br.close();
	}

}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함