KU COSE101 2016기말고사 4번 문제
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