{ }codelper
문자열 만들어 가기문자열 돌기P0027

같은 글자 묶어 줄이기

영어 소문자로 된 문자열이 주어진다.
같은 글자가 연달아 이어진 묶음마다 그 글자와 이어진 개수를 차례로 붙여 한 줄로 출력하라.
예를 들어 "aaabcc"는 a 3개, b 1개, c 2개이므로 "a3b1c2"이다.
개수가 1이어도 1을 쓰고, 떨어져 있는 같은 글자는 다른 묶음이다("aba" → "a1b1a1").

입력
길이 1 ~ 5,000, 영어 소문자만
출력
줄인 문자열 한 줄
예시 1 · stdin
aaabcc
stdout
a3b1c2
예시 2 · stdin
zzzzzzzzzzzzy
stdout
z12y1
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

가장 흔한 실수는 마지막 묶음을 빼먹는 것이에요.
"글자가 바뀔 때 앞 묶음을 쓴다"로 짜면 반복이 끝난 뒤 남은 묶음을 한 번 더 써야 해요.
묶음의 끝을 안쪽 반복으로 찾아 바로 쓰면 이 문제가 없어요.
결과를 모으는 방법: Python은 목록에 모아 "".join, Java StringBuilder, C# StringBuilder, C++ std::string의 +=, C는 printf("%c%d")로 바로 쓰고, JS·TS는 배열에 모아 join(""), 크레이콘은 out = out + s[i] + (j - i).
Java·C#에서 문자열에 +를 거듭하면 매번 새 문자열을 만들어서, 길어질수록 느려져요.
또 C에서 '0' + count로 한 글자만 쓰면 10개 넘는 묶음이 깨져요.

Pythonmain.py · 10 줄
s = input()parts = []i = 0while i < len(s):    j = i    while j < len(s) and s[j] == s[i]:        j += 1    parts.append(s[i] + str(j - i))    i = jprint("".join(parts))
JavaScriptmain.js · 10 줄
const s = require("fs").readFileSync(0, "utf8").trim();const parts = [];let i = 0;while (i < s.length) {  let j = i;  while (j < s.length && s[j] === s[i]) j++;  parts.push(s[i] + (j - i));  i = j;}console.log(parts.join(""));
TypeScriptmain.ts · 11 줄
import { readFileSync } from "node:fs";const s: string = readFileSync(0, "utf8").trim();const parts: string[] = [];let i = 0;while (i < s.length) {  let j = i;  while (j < s.length && s[j] === s[i]) j++;  parts.push(s[i] + (j - i));  i = j;}console.log(parts.join(""));
JavaMain.java · 18 줄
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        String s = br.readLine().trim();        StringBuilder out = new StringBuilder();        int i = 0;        while (i < s.length()) {            int j = i;            while (j < s.length() && s.charAt(j) == s.charAt(i)) j++;            out.append(s.charAt(i)).append(j - i);            i = j;        }        System.out.println(out);    }}
C#Main.cs · 20 줄
using System;using System.Text; class Program{    static void Main()    {        string s = Console.ReadLine().Trim();        var sb = new StringBuilder();        int i = 0;        while (i < s.Length)        {            int j = i;            while (j < s.Length && s[j] == s[i]) j++;            sb.Append(s[i]).Append(j - i);            i = j;        }        Console.WriteLine(sb.ToString());    }}
C++main.cpp · 16 줄
#include <iostream>#include <string> int main() {    std::string s, out;    std::cin >> s;    size_t i = 0;    while (i < s.size()) {        size_t j = i;        while (j < s.size() && s[j] == s[i]) j++;        out += s[i];        out += std::to_string(j - i);        i = j;    }    std::cout << out << "\n";}
Cmain.c · 16 줄
#include <stdio.h> static char s[5005]; int main(void) {    if (scanf("%5000s", s) != 1) return 0;    int i = 0;    while (s[i]) {        int j = i;        while (s[j] == s[i]) j++;        printf("%c%d", s[i], j - i);        i = j;    }    printf("\n");    return 0;}
Craykonmain.cray · 14 줄
s = 콘솔.줄읽기().공백제거();out = "";i = 0;동안 (i < s.길이){    j = i;    동안 (j < s.길이 && s[j] == s[i])    {        j++;    }    out = out + s[i] + (j - i);    i = j;}콘솔.쓰기(out);