위의 문제 1-1의 방식은 반복되는 문자가 적은 경우 압축률이 낫다는 단점이 있습니다. 예를 들면, "abababcd"와 같은 문자열은 전혀 압축되지 않았습니다. "어피치"씨는 이러한 단점을 해결하기 위해 문자열을 이번에는 2개 단위로 잘라서 압축하여 더 짧은 문자열로 압축해보려 합니다.
예를 들어, "abababmnxyxy"의 경우 문자를 1개 단위로 자르면 전혀 압축되지 않지만, 2개 단위로 잘라서 압축하면 "3abmn2xy"로 표현할 수 있습니다.
주어진 문자열에 대해서 문자 2개의 단위로 잘랐을때 반복되는 것을 압축하여 표현하여 그 문자열의 길이를 출력하는 프로그램을 작성하라.
예 #1
abababxyx <-입력
3abxyz <-출력: 압축된 문자열 ab/ab/ab/xy/z
6<- 출력: 압축된 문자열의 길이
예#2
aaaa <-입력
2aa <-출력: 압축된 문자열: aa/aa
3<- 출력: 압축된 문자열의 길이
예#3
xabab <- 입력
xabab <- 출력: 압축된 문자열 (2개 단위로 짤랐을때 반복 없음: xa / ba / ba / b)
5 <- 출력: 압축된 문자열의 길이
제한사항: 앞의 문제 1-1과 그대로
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 두 개의 문자들 연속에 대한 축약
int solution2(char* s)
{
int count = 1;
char flag[1001] = { 0 };
int j = 0;
int len = 0;
for (int i = 0; i < strlen(s); i = i + 2) {
if (s[i] == s[i + 2] && s[i + 1] == s[i + 3])
count++;
else {
if (count > 1) {
flag[j] = (count + 48);
j++;
}
flag[j] = s[i];
j++;
flag[j] = s[i + 1];
j++;
count = 1;
}
}
flag[j] = '\0';
printf("%s", flag);
printf("\n");
for (int k = 0; flag[k] != '\0'; k++) {
len++;
}
return len;
}
int main(void)
{
char s[1001];
scanf("%s", s);
printf("%d\n", solution2(s)); // 문제-2)
}
|
cs |
이 문제도 컴프 기말고사에 나온 문제이다
이 문제도 지난학기에 푼 코드를 가져왔다
교수님의 말대로 수정한 버전
이게 더 깔끔하다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
int solution(char* s) //ababccdddd라 하면 ab가 str1, ab가 str2
{
int i, j = 0;
int len;
int q = 2;
int k;
char temp[1000] = "";
char str1[5001] = "";
char str2[5001] = "";
strncpy(str1,s,2);//strncpy로 초기값 설정
len = 1;
for (q = 2; q < strlen(s); ) { //달라지고
for (k = 0; k < 2; k++, q++) {
str2[k] = s[q];
}
if (strcmp (str1, str2) == 0) //str1과 str2가 같으면
len++;
else { //다르면
if (len > 1)
temp[j++] = len + '0'; //숫자를 문자로 변환
strcat(temp, str1, 2);//strcat으로 문자를 넣기
j = j + 2;
strcpy(str1,str2); //strcpy
len = 1; //길이 초기화
}
}
if (len > 1)
temp[j++] = len + '0'; //숫자를 문자로 변환
strcat(temp, str1, 2);//strcat으로 문자를 넣기
j = j + 2;
temp[j] = '\0';
printf("%s\n", temp);
return strlen(temp);
}
int main(void)
{
char s[1001];
scanf("%s", s);
printf("\n%d\n", solution(s)); // 문제-2)
}
|
cs |
'대학교 2-1 > 문해기' 카테고리의 다른 글
카카오 입사시험_문자열 압축: 문제 1-3 (0) | 2024.05.16 |
---|---|
카카오 입사시험_문자열 압축: 문제 1-2 (발전) (0) | 2024.05.16 |
카카오 입사시험_문자열 압축: 문제 1-1 (0) | 2024.05.16 |
LAB(함수의 값 출력) (0) | 2024.03.17 |
LAB(사이클 숫자-순환) (0) | 2024.03.17 |