문자열 압축하기

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

입력 예시: aaabbcccccca

출력 예시: a3b2c6a1

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

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

def compress_string(string)
  string.scan(/(\w)(\1*)/).map{|c, l| c + (l.size + 1).to_s}.join
end

지금 다시보니 gsub 만으로 해결할 수 있는 문제네요.

def compress_string(string)
  string.gsub(/((\w)\2*)/) { "#{$2}#{$1.size}"}
end
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
class String
  def compress
    self.chars.chunk{|e|e}.map{|e,a|[e,a.size]}.join
  end
end

루비 Enumerator를 체이닝해서 풀었습니다. 풀이 과정을 조금 풀어써보면, 아래와 같습니다.

"aaabbcccccca".compress
=> "a3b2c6a1"
"aaabbcccccca".chars
=> ["a", "a", "a", "b", "b", "c", "c", "c", "c", "c", "c", "a"]
"aaabbcccccca".chars.chunk{|e|e}.to_a
=> [["a", ["a", "a", "a"]], ["b", ["b", "b"]], ["c", ["c", "c", "c", "c", "c", "c"]], ["a", ["a"]]]
"aaabbcccccca".chars.chunk{|e|e}.map{|e,a|[e,a.size]}
=> [["a", 3], ["b", 2], ["c", 6], ["a", 1]]
"aaabbcccccca".chars.chunk{|e|e}.map{|e,a|[e,a.size]}.join
=> "a3b2c6a1"
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

clojure

(defn string-compress [s]
  (->> s
       (partition-by identity)
       (mapcat (fn [x] [(first x) (count x)]))
       (apply str)))

(string-compress "aaabbcccccca")
;=> "a3b2c6a1"
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Perl

perl -le"$_=<>;s/((\w)\2*)/$2.(length $1)/ge;print"
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Swift로 풀어보았습니다.

import Foundation

func partition(array: [String]) -> [[String]] {
  var result = [[String]]()
  var lastValue: String?

  for item in array {
    let value = item

    if value == lastValue {
      result[result.count-1].append(value)
    } else {
      result.append([value])
      lastValue = value
    }
  }
  return result
}

var x = partition(["a","a","c", "d", "b","b","b","b","c","c","c","c"])
  .map{ (item: [String]) -> String in
    let count = item.reduce(0){ (s0, s1) in s0 + 1 }
    let str = item.first! + String(count)
    return str
  }.reduce("") { $0 + $1 }

println("Result : \(x)")
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

c 언어입니다.

#include <stdio.h>
 int main(void)
 {
     int a = 0, b = 0, c = 0, d = 0, e = 0, arr[100];
     char str[100], str1[100];
     printf("문자열을 써라. 문자열을 압축시키겠다.");

     scanf("%s", &str);

     while(str[a - 1]!=0)
     {
        if(d==0)
        {
            str1[c] = str[a];
            d++;
        }
        else if(str[a]==str1[c])
        {
            b++;
            a++;
        }
        else if(str[a]!=str1[c])
        {
            arr[c] = b;
            b = 0;
            d = 0;
            c++;
        }
     }
     c = 0; 
     while(str1[c]!=0)
     {
        printf("%c", str1[c]);
        printf("%d",arr[c]);
        c++;
     }

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

s = "aaabbcccccca" r = "" prev = s[0] cnt=0 for c in s: if c == prev: cnt += 1 else: r += prev + str(cnt) cnt=1 prev = c r += prev + str(cnt) print(r)

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

스위프트 문법 연습중.

var input = "aabbbcczzaaa"

var output : Array<Int> = Array<Int>(count: 26, repeatedValue: 0)

for char in input.characters{
    var num = String(char).lowercaseString.utf8.map{Int($0)}[0]

    num -= 97
    var count = output[num]
    count += 1
    output[num] = count
}

var first = 97
for i in output{

    if(i == 0){
        ++first
        continue
    }

    var c = String(UnicodeScalar(first))
    ++first
    print("\(c)\(output[i])")
}

2016/02/29 17:35

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


str = input("입력")
ls=[]
dic={}

for i in range(len(str)):
    ls.append(str[i])


for i in range(len(ls)):
    number=0
    a=ls[i]
    for k in dic.keys():
        if a==k:
            continue
    for j in range(len(ls)):
        if a==ls[j]:
            number+=1
    dic[a]=number



print(dic)            




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

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

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

풀이 작성

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

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(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