문자열 압축하기

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

입력 예시: aaabbcccccca

출력 예시: a3b2c6a1

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

151개의 풀이가 있습니다. 1 / 16 Page

var strzip = function(str) {
    return str.replace(/(\w)\1*/g, (str, ch) => ch + str.length);
};

console.log(strzip("aaabbcccccca"));
console.log(strzip("abcdefg"));
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
let count = 1;
let line = '';

let loopFunc = (str) => {
    for(let i = 0; i < str.length; i++){
        if(str.charAt(i) == str.charAt(i+1)){
            count++;
        }else{
            line += (str.charAt(i)+count);
            count = 1;
        }
    }
    return line;
}

console.log(loopFunc('aaabbcccccca'));

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

text = input("text : ")

x = [text[i] for i in range(0,len(text))]

count = 1
a = x[0]+str(count)
b = []

for i in range(1,len(x)):
    if x[i-1] == x[i]:
        count = count + 1        
        a = x[i-1]+str(count)
    else:
        b.append(a)
        count = 1
        a = x[i]+str(count)


b.append(a)

print ("compress :",''.join(b))


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

c로 풀이


#include <stdio.h>
int main(void)
{
    int i,num=0;
    char s[20];

    printf("입력 : ");
    scanf("%s",s);

    for(i=0;i<20;i++)
    {
        if (s[i]==s[i-1]) num++;
        else
        {
            if(num!=0) printf("%d",num);
            printf("%c",s[i]);
            num=1;
        }
        if(s[i]=='\0') break;
    }
    return 0;
}

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

(한줄코드)Python 3.6, 자고 일어났더니 한결 좋아졌습니다.

import re, functools

functools.reduce(str.__add__, (y+str(len(x)) for x,y in re.findall(r"((\w)\2*)", 'aaabbcccccca')))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
a = str(input("압축할 문자열 입력 : ")) + chr(32)
b = ''
count = 1
for i in range(len(a) - 1):
    if a[i] == a[i + 1]:
        count += 1
    else:
        b += a[i] + str(count)
        count = 1
print(b)

공백문자를 사용하니까 코드가 꽤나 줄여지더군요.

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

def compress(N):

length = len(N)
i = 0
List1 = []
List2 = []
while(i < length-1):

    t1 = N[i]
    t2 = N[i+1]
    if t1 == t2:
        List1.append(t1)
        if i == length-2:
            List1.append(t2)
            counter = List1.count(t1)
            List2.append(t1)
            List2.append(str(counter))
    elif t1 != t2 :
        List1.append(t1)
        counter = List1.count(t1)
        List2.append(t1)
        List2.append(str(counter))
        List1 = []
        if i == length-2 :
            List1.append(t2)
            counter = List1.count(t2)
            List2.append(t2)
            List2.append(str(counter))

    i += 1  
return "".join(List2)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Java로 작성했습니다.

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int count = 1, i = 0;

        while (true) {
            if (i == s.length() - 2) {
                System.out.print(s.charAt(i) + "" + (count + 1));
                break;
            } else if (s.charAt(i) == s.charAt(i + 1)) {
                count++;
                i++;
            } else if (s.charAt(i) != s.charAt(i + 1)) {
                System.out.print(s.charAt(i) + "" + count);
                i++;
                count = 1;
            }
        }
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
inputString = "abbcccdddd"
inputStringList = list(inputString)
outputString = ""
number = 1

for i in range(len(inputString)):
    if i == 0:
        outputString += inputString[i]
    elif inputString[i] == inputString[i-1]:
        number += 1
        if i == len(inputString)-1:
            outputString += str(number)
    else:
        outputString += str(number)
        outputString += inputString[i]
        number = 1

print(outputString)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
자바로 풀어봤습니다      

        String text = "aaabbccfAAAad";
        StringBuffer sb = new StringBuffer();

        int count = 1;
        for(int i=0; i<text.length(); i++) {
            if(i != text.length()-1) {
                char strandardChar = text.charAt(i);
                char compareChar = text.charAt(i+1);

                if(strandardChar == compareChar) {
                    count++;
                }else {
                    sb.append("" + strandardChar + count);
                    count = 1;
                }

            // 마지막 문자 처리    
            }else {
                char strandardChar = text.charAt(i);
                sb.append("" + strandardChar + count);
            }
        }

        System.out.println(sb.toString());
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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

run-length x 2
연관 문제
김우주, 2017/06/24 15:08

언어별 풀이 현황
전 체 x 151
javascript x 3
python x 60
기 타 x 22
java x 36
cpp x 15
cs x 6
haskell x 1
php x 2
go x 1
ruby x 1
objectivec x 1
perl x 1
scala x 2