영어 소문자로 된 문자열이 주어진다. 같은 글자가 연달아 이어진 묶음마다 그 글자와 이어진 개수를 차례로 붙여 한 줄로 출력하라. 예를 들어 "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
오류 목록00F8 ↓ · ⇧F8 ↑
입력(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);