문자열 압축하기

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

입력 예시: aaabbcccccca

출력 예시: a3b2c6a1

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

56개의 풀이가 있습니다. 1 / 6 Page

파이썬 2.7


s = 'aabcccaaaaas'

result = s[0]  # 첫번째 값을 결과에 넣는다
count  = 0   #

for st in s:
    if st == result[-1]:  #
        count += 1
    else:
        result += str(count) + st
        count = 1
result += str(count)

print result


결과:
a2b1c3a5s1
간단한 부분만 사용하였고, 직관적이고 좋네요 감사합니다 - 님드락, 2016/11/22 16:17 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def stringCompress_rec(string):
    ans = ''
    count = 1
    string = string + '\0'
    for i in range(1, len(string)):
        if string[i - 1] == string[i]:
            count += 1
        else:
            ans += string[i - 1] + str(count) + stringCompress_rec(string[i:])
            break
    return ans
코드가 참 깔끔하고 알아보기가 쉽네요 - Shin gil sang, 2015/11/09 19:30 M D
string = string + '\0' 이부분의 의미가 어떻게 되나요? - kim SeongHyeon, 2016/08/06 16:24 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
from itertools import *
while __name__ == '__main__':
    inpt = input('입력: ');s = ''
    for x, y in groupby(inpt):
        z = len(list(y))
        s = s+x
        if z>1:s = s+str(z)
    print(s)

짧게 줄이려고 했는데 y를 한번 호출하면 빈 리스트가 돼서 포기했습니다.... 파이썬 3.5.1입니다.

+추가: 시간이 지나고 보니 줄일 수 있더군요.

from itertools import groupby
while __name__ == '__main__':
    print(''.join(x + (lambda z: str(z) if z>1 else '')(len(list(y))) for x,y in groupby(input('입력: '))))

+줄바꿈 없음

list(print(''.join(x + (lambda z: str(z) if z>1 else '')(len(list(y))) for x,y in __import__('itertools').groupby(input('입력: ')))) for x in __import__('itertools').count())

+임포트 반복 제거

(lambda it: list(print(''.join(x + (lambda z: str(z) if z>1 else '')(len(list(y))) for x,y in it.groupby(input('입력: ')))) for x in it.count()))(__import__('itertools'))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Python

import re

input_data = "aaabbcccccca"

filted = re.findall("(\\w)(\\1*)", input_data)

output = ""
for x, y in filted:
    output += x
    if not len(y) == 0:
        output += str(len(y) + 1)  

print(output)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def stringCompressor(s):
    s += "\0"
    m = 0
    n = len(s)
    result = ""
    while 1:
        for i in range(m,len(s)):
            if s[m] != s[i]:
                n = i
                break
        result = result+s[m]+str(n-m)
        m = n
        if n == len(s)-1:
            break
        else:
            n = len(s)

    return result
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
ExString = 'aaabbcccccca'
ResltList =[]
count = 1
index = 0

while 1:
    if index+1 is len(ExString):
        ResltList.append(ExString[index])
        ResltList.append(str(count)) 
        break
    elif ExString[index] is  ExString[index+1]:
        count += 1
        index += 1
        #print(count)
        #print(index)
    else:
        ResltList.append(ExString[index])
        ResltList.append(str(count)) 
        #print(ResltList)
        count =1
        index += 1
print(''.join(ResltList))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

python 2.7

def compress_string(s):
    _c = ""
    cnt = 0
    result = ""
    for c in s:
        if c!=_c:
            _c = c
            if cnt: result += str(cnt)
            result += c
            cnt = 1
        else:
            cnt +=1
    if cnt: result += str(cnt)
    return result

print compress_string("aaabbcccccca")
출력 결과가 "a3b2c6a"로 나옵니다. - race.condition, 2015/01/04 09:20 M D
아.. 그러네요. 수정했습니다. 마지막 cnt값을 append하는것을 잊었네요. 알려주셔서 감사합니다. - 길가의풀, 2015/01/05 09:08 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

coding by python beginner

import sys; t0 = sys.argv[1]
prev = rs = ''
dupCnt = 1
for i in range( len(t0) ):
    if t0[i] == prev:
        dupCnt +=1;
    elif prev != '':
        rs = rs + prev + str(dupCnt)
        dupCnt = 1;
    prev = t0[i]
    if i == len(t0)-1: rs = rs + prev + str(dupCnt)

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

파이썬 2.7입니다.


str_in = raw_input("Enter string: ")

count = 0
compressed_str = []

for index in str_in:
    if count == 0:
        compressed_str.append(index)
        count += 1
    elif index == compressed_str[-1]:
        count += 1
    elif index != compressed_str[-1]:
        compressed_str.append(count)
        compressed_str.append(index)
        count = 1

compressed_str.append(count)

print reduce(lambda x,y: str(x)+str(y),compressed_str)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import sys

def main():
    try:
        s = sys.argv[1]
        count = 1
        temp =''
        result=''

        for word in s:
            if temp == '':
                temp = s[0]
            elif temp != word:
                result += temp + str(count)
                temp = word
                count = 1
            else:
                count = count + 1
        result += temp + str(count)
        print(result)    

    except IndexError:
        print('Usage : python3 [compression.py] [string]')
if __name__ == '__main__':
  main()

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

풀이 작성

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

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

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

언어별 풀이 현황
전 체 x 139
python x 56
기 타 x 19
java x 34
cpp x 14
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