상세 컨텐츠

본문 제목

1-5 반복되는 문자 압축 후, 압축된 수만큼 출력

과제

by 근성 2021. 7. 8. 15:59

본문

이번 문제는 문자열을 입력받고

그 문자가 두 번 이상 반복될 경우에 압축을 시키는 프로그램입니다.

그 문자가 알파벳이든 특수문자든 상관없이

aaabbeee 면 a3b2e3을 출력시키는 그런 것입니다.

단, 연속해서 나오는 문자만 가능합니다.

#include<iostream>

#define MAX_STRING_SIZE 256 //배열 크기 선언

using namespace std;

int main()
{
	char arr[MAX_STRING_SIZE];
	int count = 1;
	scanf_s("%[^\n]s", arr, MAX_STRING_SIZE);//공백값까지 입력

	for (int i = 0; *(arr + i) != 0; i++)
	{
		if (arr[i] != arr[i + 1]) 
		{
			cout << arr[i];//뒤에 배열과 값이 같지 않다면 출력
			if (count >= 2)//전에 배열과 같다가 뒤에 배열과 다를경우
			{
				cout<< count;
				count = 1;//압축갯수 초기화
			}
		}
		else
			count++;//압축갯수 증가
	}
	
	return 0;
}

배열 크기는 그냥 제 마음대로 define 했습니다.

그리고 이 문제에서 제가 쓴 핵심은 scanf_s("%[^\n] s", arr, MAX_STRING_SIZE);입니다.

scanf는 보통 공백을 입력받지 못해서 공백이나 줄 바꿈이 오면 입력을 받지 않는 함수입니다.

하지만 그런 scanf함수공백까지 입력을 받게 하려면 [^\n]을 사용하면 됩니다.

 

보통의 scanf로 문자열을 입력받을 때는 scanf_s("%s", arr); 이지만

[^\n]를 추가하고 얼마큼 받을 건지 작성하면

scanf_s("%[^\n]s", arr, MAX_STRING_SIZE); 공백까지 입력받을 수 있습니다.

첫번째 사진은 보통의 압축 두번째 사진은 공백까지 입력받을때

이제 소스코드를 보시면 뒤에 배열과 값이 같은 경우는 압축 개수를 증가시켰고, 뒤에 배열과 값이 다르다면 전에 배열과 같다가 뒤에 배열과 다를 경우를 구분한 것을 확인할 수 있습니다.

 

#이 문제의 출처는 kw대학교 컴퓨터정보공학부 2021년 1학기 객체지향프로그래밍 과제문제입니다.

관련글 더보기

댓글 영역