본문 바로가기

대학교 2-1/문해기

카카오 입사시험_문자열 압축: 문제 1-2

위의 문제 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