Ye0ngJae

[BOJ] 21966번 "(중략)" C언어 풀이 본문

알고리즘/C언어

[BOJ] 21966번 "(중략)" C언어 풀이

Ye0ngJae 2022. 4. 14. 11:05
728x90

문제

 

드높은 남산 위에 우뚝 선

(중략)

세워라 반석 위에

선린의 터를

 

 

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

 

단, 입출력의 편의를 위해 문장들을 공백 없이 모두 붙여 구성한 문자열 S가 대신 주어진다. 문자열의 첫 글자부터 가장 먼저 만나는 '.'(마침표)까지, 그리고 각 '.'의 다음 글자부터 가장 먼저 만나는 '.'까지를 한 문장으로 생각하기로 하자. 예를 들어 주어진 문자열 S가 'IamInevitable.IamIronMan.'이라면 'IamInevitable.'이 한 문장, 'IamIronMan.'이 한 문장이다.

 

규칙은 다음과 같다.

  1.  S의 길이가 25 이하면 S를 그대로 출력한다.
  2.  S의 길이가 25 초과이면, S의 앞에서부터 11글자, 뒤에서부터 11글자를 제외하고 나머지 부분을 생각하자. 이 나머지 부분이 모두 같은 문장에 속한다면, 생략한 뒤 '...'('.' 3개)으로 바꿔서 출력한다.
  3. 위 두 경우에 해당되지 않는다면 S를 앞에서부터 9글자, 뒤에서부터 10글자만 남기고 중간은 '......'('.' 6개)으로 바꿔서 출력한다.

입력

첫 번째 줄에 문자열의 길이 N이 주어진다.

두 번째 줄에는 N글자로 이루어진 문자열 S가 주어진다.

출력

문제에서 제시된 규칙에 따라 S를 25글자 이내로 요약해서 출력한다.

 

제한

 2 ≤ N ≤100000

 

문자열 S는 알파벳 대문자, 알파벳 소문자, 쉼표(,), 마침표(.)로만 구성되어 있다.

문자열 S의 첫 글자는 마침표(.)가 아니다.

문자열 S의 마지막 글자는 마침표(.)이다.


입력 예시

1.

11
IamIronMan.

2.

26
And,IamIronMan.IamIronMan.

3.

29
IamInevitable.And,IamIronMan.

출력 예시

1.

IamIronMan.

2.

And,IamIron...IamIronMan.

3.

IamInevit......amIronMan.

답안

더보기

코드

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS

char string[1000000];

int main() {

	int input, toggle=0;
	
	scanf("%d", &input);
	scanf("%s", string);

	for (int i = 11; i < input - 12;i++) {
		if (string[i] == '.')
			toggle = 1;
	}
	if (input <= 25)
		printf("%s", string);
	else if (input > 25 && toggle == 0) {
		for (int i = 0; i < 11; i++) {
			printf("%c", string[i]);
		}
		printf("%s", "...");
		for (int i = input - 11; i < input; i++) {
			printf("%c", string[i]);
		}
	}
	else {
		for (int i = 0; i < 9; i++) {
			printf("%c", string[i]);
		}
		printf("%s", "......");
		for (int i = input - 10; i < input; i++) {
			printf("%c", string[i]);
		}
	}

	return 0;
}

 

풀이

우선 문자열의 길이를 input 변수를 통해 입력 받는다. 그리고 문자열을 string 배열에 저장한다. 다음으로 처음 for문을 도는데 이는 중략될 문자 사이에 마침표(.) 즉, 문장의 끝을 찾으면 toggle 변수를 1로 지정한다. toggle 변수는 중략될 문자열에 마침표의 존재 여부를 알아내어 문제에서 설명하는 2번과 3번을 구별하기 위해서이다.

 

toggle 변수가 저장되고, if문에 도달하게 된다. 여기서 문자열의 길이가 25 이하면,  해당 문자열을 그대로 출력한다. 만일 input 값이 25보다 크고, toggle 값이 0이라면  입력 받은 문자열의 앞에서 11자리와 뒤에서 11자리를 출력하면서 사이에 ...을 입력한다. 

 

만일 위 사항에도 해당되지 않을 경우 문자열의 앞에서부터 9자리와 뒤에서부터 10자리를 출력하고, 해당 문자열 사이에 ......을 입력한다.

728x90