KU COSE101 2016기말고사 4번 문제

1 minute read

             
2016 기출 1번 2번 3번 4번 5번  
2017 기출 1번 2번 3번 4번 5번  
2018 기출 1번 2번 3번 4번 5번 6번

영문자로만 이루어져 있고 반복된 문자가 많이 나오는 문자열의 경우 문자의 반복횟수를 표시하여 문자열의 길이를 줄일 수 있다. 예를 들어 다음과 같이 변환할 수 있다.

  • “zzzzzzzz” –> “8z”
  • “bbbbcceeeee” –> “4b2c5e”

한 문자의 반복 횟수는 최대 9회이고, 문자가 반복되지 않는 경우는 반복횟수를 표시하지 않는다. 또 이 알고리즘은 대문자와 소문자를 구분하고, 공백 문자열은 그대로 둔다.

  • “abcde” –> “abcde”
  • “aaaaaAAAA” –> “5a4A”
  • ”” –> “”

(a) 주어진 문자열을 압축하는 함수 strcompress를 작성하시오.

void strcompress(char* input, char* output) {

}

int main() {
  char str[] = "zzzzzzzzaaabbcdddeee";
  char comp[100];
  strcompress(str, comp);
  printf("Compress: %s\n", comp);
}

(b) 압출된 문자열을 복원하는 함수 strdecompress를 작성하시오.

void strdecompress(char* input, char* output) {

}

int main() {
  char comp[] = "8z3a2bc3d3e";
  char decomp[100];
  strdecompress(comp, decomp);
  printf("Decompress: %s\n", decomp);
}

예시풀이
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void strcompress(char* input, char* output) {
	int len = strlen(input);
	int cnt = 1;
	int p = 0,i;
	
	for(i=1 ; i<len ; i++){
		if(input[i] != input[i-1]){
			if(cnt>1) output[p++] = cnt+'0';
			output[p++] = input[i];
			cnt = 1;
		}
		else{
			cnt++;
		}
	}
}

void strdecompress(char* input, char* output) {
	int len = strlen(input);
	int p = 0, i, j;
	for(i=0 ; i<len ; i++){
		if(input[i] >= '2' && input[i] <= '9'){
			for(j=0 ; j<input[i]-'0'-1 ; j++){
				output[p++] = input[i+1];
			}
		}
		else{
			output[p++] = input[i];
		}
	}
}

int main() {
	char str[] = "zzzzzzzzaaabbcdddeee";
	char comp[100];
	char decomp[100];
	strcompress(str, comp);
	printf("Compress: %s\n", comp);
	strdecompress(comp, decomp);
	printf("Decompress: %s\n", decomp);
}

Comments