백준 - 21966번((중략))

최지홍·2022년 5월 24일
0

백준

목록 보기
134/145

문제 출처: https://www.acmicpc.net/problem/21966


문제

  • 1개 이상의 문장들이 주어진다. 아래 규칙에 따라 문장들의 중간 부분을 적당히 생략해 25글자 이내로 요약해서 출력하는 프로그램을 작성하자.

  • 단, 입출력의 편의를 위해 문장들을 공백 없이 모두 붙여 구성한 문자열

  • SS가 대신 주어진다. 문자열의 첫 글자부터 가장 먼저 만나는 '.'(마침표)까지, 그리고 각 '.'의 다음 글자부터 가장 먼저 만나는 '.'까지를 한 문장으로 생각하기로 하자. 예를 들어 주어진 문자열

  • SS가 'IamInevitable.IamIronMan.'이라면 'IamInevitable.'이 한 문장, 'IamIronMan.'이 한 문장이다.

  • 규칙은 다음과 같다.

  1. SS의 길이가 25 이하면 SS를 그대로 출력한다.

  2. SS의 길이가 25 초과이면, SS의 앞에서부터 11글자, 뒤에서부터 11글자를 제외하고 나머지 부분을 생각하자. 이 나머지 부분이 모두 같은 문장에 속한다면, 생략한 뒤 '...'('.' 3개)으로 바꿔서 출력한다.

  3. 위 두 경우에 해당되지 않는다면 SS를 앞에서부터 9글자, 뒤에서부터 10글자만 남기고 중간은 '......'('.' 6개)으로 바꿔서 출력한다.


  • 정규표현 버전
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(reader.readLine());    // 문자열의 길이

        String target = reader.readLine();

        if (target.length() <= 25) {
            System.out.println(target);
            return;
        }

        String temp = target.substring(11, target.length() - 11);
        if (!temp.matches(".*\\..*") || temp.matches("^[^.]*\\.$")) {
            // 중간에 마침표가 없거나, 문장의 마지막에만 마침표가 위치하는 경우
            System.out.println(target.substring(0, 11) + "..." + target.substring(target.length() - 11));
        } else {
            System.out.println(target.substring(0, 9) + "......" + target.substring(target.length() - 10));
        }
    }

}
  • 반복문 버전
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(reader.readLine());    // 문자열의 길이

        String target = reader.readLine();

        if (target.length() <= 25) {
            System.out.println(target);
            return;
        }

        String temp = target.substring(11, target.length() - 11);
        for (int i = 0; i < temp.length(); i++) {
            if (temp.charAt(i) == '.' && i != temp.length() - 1) {
                System.out.println(target.substring(0, 9) + "......" + target.substring(target.length() - 10));
                return;
            }
        }

        System.out.println(target.substring(0, 11) + "..." + target.substring(target.length() - 11));
    }

}

  • 정규표현을 사용해 보고 싶은 욕심에 여러번의 시도 끝에 맞았다. 그런데 그냥 반복문을 쓰는게 더 빨랐다;;
profile
백엔드 개발자가 되자!

0개의 댓글