문자열 압축하기

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

입력 예시: aaabbcccccca

출력 예시: a3b2c6a1

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

134개의 풀이가 있습니다. 12 / 14 Page

problem1.py

a = list(input("입력 : "))

count=0 word = a[0]

for i in range(0,len(a)):

if word == a[i]:
    count += 1

    if i == len(a) - 1:
        print(word + str(count), end=' ')
        exit(-1)

else:
    print(word + str(count), end='')
    word = a[i]
    count = 1
    if i == len(a) - 1:
        print(word + str(count), end=' ')
        exit(-1)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
/*
1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오. 
(단 점들의 배열은 모두 정렬되어있다고 가정한다.)

예를들어 S={1, 3, 4, 8, 13, 17, 20} 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.
 */


public class Algorithm5 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] nS = {1, 3, 4, 8, 13, 17, 20};
        int[] nTotal = new int[2];

        int nTemp = 0, nMin = 999;

        for(int i = 1; i < nS.length; i++) {
            nTemp = nS[i] - nS[i-1];

            if(nTemp < nMin) {
                nMin = nTemp;
                nTotal[0] = nS[i-1];
                nTotal[1] = nS[i];
            }   // end if
        }   // end for

        System.out.println("가장 거리가 짧은 것은 :" + nTotal[0] + ", " + nTotal[1] + "입니다.");
    }

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class Lv1_02 {
    public static void main(String[] args) {
        StrAlzip s = new StrAlzip();
        s.play();
    }
}

class StrAlzip {
    private String str;

    public StrAlzip() {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        this.str = str+" ";     // for문에 필요한 조건을 위해 공백을 하나 더함
    }

    void play(){
        int count = 1;

        for (int i = 1; i < str.length(); i++) {
                if (str.charAt(i-1)==str.charAt(i)) {
                    count++;
                }else if (str.charAt(i-1)!=str.charAt(i)) {
                    System.out.print(str.charAt(i-1));
                    System.out.print(count);
                    count = 1;
                }
        }
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

#python 2.7x

stack = list('aaabbccccccaaabbccddaab'[::-1])
before,cnt,result = stack[-1],0,''
while stack:
    new = stack.pop()
    if before == new:
        cnt += 1
    else:
        result += "{}{}".format(before,cnt)
        before,cnt = new,1
result += "{}{}".format(new,cnt)
print result

파이썬2.7을 사용하였습니다. 스택을 이용했습니다 :P

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

import java.util.Scanner;

public class test04 { public static void main(String[] args) {

    String str;
    int cnt = 1;

    Scanner sc = new Scanner(System.in);
    System.out.print("문자를 입력하세요 : ");
    str = sc.nextLine();

    char[] ch = str.toCharArray();
    for(int i = 0 ; i <= str.length()-1; i++){

        if(str.length()-1 > i){
            if(ch[i] == ch[i+1]){
                cnt++;
            }else{
                System.out.print(ch[i] + "" + cnt);
                cnt = 1;
            }
        }else{
            System.out.print(ch[i] + "" + cnt);
        }
    }
}

}

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

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

#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;
}


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

public class StringComp {
    public static void main(String[] args) {
        String input = "aaabbcccccca";
        int length = input.length();
        char[] output = new char[length*2];
        int outputIndex = 0;
        int outputNum = 0;
        for (int i=0; i<length; i++) {
            if (i == 0) {
                outputIndex = 0;
                output[outputIndex] = input.charAt(i);
                outputNum = 1;
            }
            else {
                if (input.charAt(i) == input.charAt(i-1)) { 
                    outputNum++;
                }
                else {
                    outputIndex = outputIndex + 2;
                    output[outputIndex] = input.charAt(i);
                    outputNum = 1;
                }
            }
            output[outputIndex+1] = Character.forDigit(outputNum, 10);
        }
        for (int i=0; i<outputIndex+2; i++) {
            System.out.print(output[i]);
        }
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import java.util.Scanner;

public class StringComp {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str = sc.next()+" ";
        int rep=1;
        StringBuffer res=new StringBuffer();
        for(int i=0;i<str.length()-1;i++){
            if(str.charAt(i) == str.charAt(i+1)){
                rep+=1;
            } else {
                res.append(str.charAt(i));
                res.append(rep);
                rep=1;
            }
        }
        System.out.println(res);
        sc.close();
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
// C++ 현재 문자가 다음 문자와 다를때만 출력.. 글자가 버퍼 - 1 보다 작아야 함.. 에러 처리 생략..

int main()
{
    char acBuff[ 10000 ]  = { 0, };

    cin >> acBuff;

    int nCount = 0;

    for( unsigned int x = 0 ; x < strlen( acBuff ) ; ++x )
    {
        ++nCount;

        if( acBuff[ x ] != acBuff[ x + 1 ] )
        {
            cout << acBuff[ x ] << nCount;

            nCount = 0;
        } 
    }

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

python 2.7

A = 'aaabbcccccca'
char = A[0]
n = 0
c= 1
new = []

for n in range(len(A)-1):
    if A[n] == A[n+1]:
        c += 1
    else:
        new += char+str(c)
        char = A[n+1]
        c = 1
        if n+1 == len(A)-1:
            new += char + str(c)

print ''.join(new)

결과 : a3b2c6a1

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

풀이 작성

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

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

run-length x 2
연관 문제
c0din9, 2017/03/17 09:25

언어별 풀이 현황
전 체 x 134
python x 55
기 타 x 19
java x 31
cpp x 13
perl x 1
scala x 2
javascript x 1
cs x 6
php x 2
objectivec x 1
ruby x 1
go x 1
haskell x 1