문자열 압축하기

문자열을 입력받아서, 같은 문자가 연속적으로 반복되는 경우에 그 반복 횟수를 표시하여 문자열을 압축하기.

입력 예시: aaabbcccccca

출력 예시: a3b2c6a1

run-length
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

11개의 풀이가 있습니다. 1 / 2 Page

그냥 C/C++ 언어 답게 풀었습니다. 쉬운 문제인데 이런 문제도 코딩 인터뷰에서 아주 자주 등장합니다.

#include <iostream>
#include <string>
#include <cassert>
#include <sstream>

std::string compress(const std::string &input) {
  if (input.length() == 0)
    return "";

  std::stringstream ss;
  char prev = input[0];
  int count = 0;
  for (auto c : input) {
    if (prev != c) {
      ss << prev << count;
      prev = c;
      count = 1;
    } else {
      ++count;
    }
  }
  ss << prev << count;
  return ss.str();
}

int main() {
  assert(compress("aaabbcccccca") == "a3b2c6a1");
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Input String :";

    string strInput;
    cin >> strInput;

    char chOri = strInput[0];
    int nNum = 1;

    for (int i = 1; i < (int)strInput.length(); ++i)
    {

        if (chOri == strInput[i])
            nNum++;
        else
        {
            cout << chOri;

            chOri = strInput[i];

            if (nNum == 1)
                continue;

            cout << nNum;
            nNum = 1;
        }
    }

    cout << chOri;
    if (nNum != 1)
        cout << nNum;

    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
/*
Solution: http://codingdojang.com/scode/465
*/
int main(){
    int i=0, j=0, cnt=0, length=0;
    char str[100];

    printf("Enter any string: ");
    scanf("%s", str);

    while(str[i] != '\0'){
        length++;
        i++;
    }

    for(i=0; i<=length; i++){
        if(str[j] == str[i]){
            cnt++;
        }
        else{
            printf("%c%d ", str[j], cnt);
            j=i;
            cnt=0;
            i--;
        }
    }

    return 0;
}

C로 해봤는데 뭔가 무식한 방법같네요;;

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char save_data[100];
    char comparing_data[] = "abcdefghijklnmopqrstuvwxyz";
    int counting_data[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
    int i, j;
    int save_data_len = 0;
    printf("put in the sentense with english not for another ");
    scanf_s("%s", &save_data, 100);
    save_data_len = strlen(save_data);
    for (i = 0; i <= save_data_len; i++)
    {
        j = 0;
        for (; j < sizeof(counting_data) / sizeof(int); j++)
            if (save_data[i] == comparing_data[j])
                counting_data[j] = counting_data[j] + 1;
        if (save_data == NULL)
            break;
    }
    i = 0;
    for (;i < sizeof(counting_data) / sizeof(int); i++)
    {
        if (counting_data[i] > 0)
        {
            printf("%c%d \n", comparing_data[i], counting_data[i]);
        }
    }
    system("pause");
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char string_arr[1000];
    int arrLen = 0;
    int i;
    int count = 0;
    char tok;

    scanf("%s", string_arr);

    arrLen = strlen(string_arr);

    for(i = 0; i < arrLen ; i++)
    {   
        tok = string_arr[i];

        if(string_arr[i+1] == tok)
        {
            count++;
        }

        if(string_arr[i+1] != tok)
        {
            printf("%c%d", tok, count+1);
            tok = string_arr[i+1];
            count = 0;
        }
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>
#include <stdio.h>

#define STR_LEN 100

int main(void) {
    char str[STR_LEN];
    char rst[STR_LEN] = { 0, };

    int j = 0;
    int num = 1;

    printf("input : ");
    gets_s(str);

    for (int i = 0; i < (int)strlen(str); i++) {
        if (!strncmp(str + i, str + i + 1, 1)) {
            num++;
        }
        else{
            strncpy(rst + j, str + i, 1);
            j++;
            _itoa(num, rst + j, 10);
            j++;
            num = 1;
        }
    }
    printf("output : %s", rst);

    system("pause");
    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

안녕하세요. C++로 풀었습니다.

#include<iostream>
#include<string>
using namespace std;


void main()
{
    cout<<"Hello Stranger??"<<endl;

    int cnt = 0;

    string str = "aaabbcccccca";
    char pre = str[0];

    for(int i=0; i<str.length()+1; i++)
    {
        if(pre == str[i])
            cnt++;
        else
        {
            cout<<pre<<cnt;
            pre = str[i];
            cnt = 1;
        }
    }

}


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
c언어로 풀었습니다

#include<stdio.h>
#include<stdlib.h>
#define STR_LENGTH 100



/* *************************************** */
/* This program is for compressing strings */
/* *************************************** */

int main(){

// Initilization 
    char str[STR_LENGTH]={0};
    char str_compr[STR_LENGTH]={0};
    char buffer[100];
    int i=0, j=0,k=0;
    int count=1;
    int index=0;

    printf("문자열을 입력하세요:");
    scanf("%s",str);
    printf("입력한 문자열은 [%s] 입니다. \n",str);

    for(i=0; i<STR_LENGTH; i++){
        if(str[i] == 0)
            break;

//check where there are overlap or not
        for(j=i; j<STR_LENGTH; j++){
            if(str[j] == str[j+1])
                count++;
            else
                break;
        }

//write compressed text to new array memory 
        if(count == 1){
            str_compr[index]=str[i];
            index++;
        }
        else{
            str_compr[index]=str[i];

            sprintf(buffer,"%d",count);
            while(buffer[k]!=0){
                str_compr[index+1+k]=buffer[k];
                k++;
            }   
            index=index+1;
            for(k=k;k>0;k--){
                index=index+1;
                }
            k=0;
        }               

//initilization of count and adding count to i  
        i = i+count-1;
        count =1;

    }

    printf("압축된 문자열은 [%s] 입니다\n",str_compr);
    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
#include <string.h>
int main()
{
    int len;
    int count = 0;
    char arr[255];
    scanf("%s", arr);
    len = strlen(arr);
    for (int i = 0; i < len; i++)
    {
        count++;
        if (arr[i] != arr[i + 1])
        {
            printf("%c%d", arr[i], count);
            count = 0;
        }
    }

}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

이렇게 풀어도 되는지 모르겠지만...코알못이라 대충 풀어봤습니다.

#include <iostream>
using namespace std;
#define MAX 256


int main()
{
    char cInput[MAX];
    int  iLength = 0;
    int iCnt = 0;

    cin >> cInput;

    iLength = strlen(cInput);

    char cCheck = cInput[0];


    for(int i = 0; i < iLength; ++i)
    {
        if(cCheck == cInput[i])
            ++iCnt;

        else
        {
            cout << cCheck << iCnt;
            iCnt = 0;

            cCheck = cInput[i];
            ++iCnt;
        }
    }
    cout << cCheck << iCnt;

    return 0;
}


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.

run-length x 2
연관 문제
Han Jooyung, 2016/11/02 23:08

언어별 풀이 현황
전 체 x 119
haskell x 1
java x 26
scala x 2
python x 49
javascript x 1
perl x 1
cs x 5
기 타 x 18
go x 1
cpp x 11
objectivec x 1
php x 2
ruby x 1