읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 문자열 알고리즘 기초: 순회·문자 판별·대소문자 변환·숫자 추출문자열의 각 문자를 순서대로 읽고 위치를 확인하는 방법을 복습합니다. 문자열을 순서대로 읽으며 같은 문자의 연속 구간을 구분합니다.
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신변수에 값을 담고 조건에 따라 합·개수·최솟값을 갱신하는 기초부터 확인합니다. 묶음이 끝나는 조건과 횟수를 초기화할 시점을 정합니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 문자열 응용 · 문제
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
대문자 문자열 압축 문제의 입력과 반환값은 무엇인가요?
대문자 문자열을 입력받아 문제의 규칙에 맞는 압축 문자열을 반환하는 문제입니다. 입출력 조건과 예제를 확인한 뒤 선택한 언어로 함수를 직접 작성해 보세요.
선수 지식은 문자열 인덱스·반복문·조건문의 기본 문법입니다. 작성한 함수는 언어별 정답과 비교할 수 있습니다.
적용 조건·범위: 별도의 공개 원문·온라인 채점 주소는 확인되지 않았습니다. 예제 확인과 로컬 코드 검증은 공식 채점 통과를 뜻하지 않습니다.
공식 문서 참고: 관련 개념: MIT 연속 반복 구간과 런 길이 인코딩
문제·입출력·제약
문자열을 왼쪽부터 읽어 연속한 문자는 하나로 줄이고 바로 뒤에 개수를 붙이세요. 떨어져 있는 같은 문자는 따로 둡니다. 예를 들어 ABBA는 AB2A입니다.
- 입력: 첫 줄에 알파벳 대문자 A–Z로 이루어진 문자열이 주어집니다.
- 제약: 길이는 100 이하입니다. 원자료에는 최소 길이가 따로 적혀 있지 않습니다.
- 출력: 압축한 문자열을 첫 줄에 출력합니다. 반복 횟수가 1이면 숫자를 생략합니다.
원본 예제 입력
KKHSSSSSSSE
원본 예제 출력
K2HS7E
KK | H | SSSSSSS | E를 각각 K2 | H | S7 | E로 바꿔 이어 붙인 결과입니다.
먼저 AAABAAA를 두 개의 A 묶음과 한 개의 B로 나눠 보세요. 현재 문자와 다음 문자가 같을 때, 다를 때 각각 무엇을 해야 할까요?
아래에서 언어를 고르고 압축 결과를 반환하는 함수를 작성하세요. AI 힌트와 정답 비교는 코드를 분석하는 기능이며 실행 채점은 아닙니다. 작성한 뒤 해답·해설 보기를 열어 비교할 수 있습니다.
직접 풀어보기
먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.
AI 힌트
코드를 실행한 채점 결과가 아닌 AI의 코드 분석입니다.
해답·해설 보기
function solution(s) {
const answer = [];
const text = s + ' ';
let count = 1;
for (let i = 0; i < s.length; i++) {
if (text[i] === text[i + 1]) {
count++;
} else {
answer.push(text[i]);
if (count > 1) answer.push(String(count));
count = 1;
}
}
return answer.join('');
}
문자열 s를 solution(s)에 전달하고 압축한 문자열을 반환합니다. 예: solution("KKHSSSSSSSE") → "K2HS7E". 함수에는 입력을 읽거나 출력하는 코드를 넣지 않습니다.
s[i]로 문자를 읽고 ===로 다음 문자와 비교합니다. 같으면 count를 늘리고, 다르면 push()로 문자와 필요한 횟수만 배열에 넣습니다. join('')은 조각을 구분자 없이 합칩니다.
ABBA는 A | BB | A이므로 AB2A입니다. A는 A, 마지막 묶음이 반복되는 ABCCC는 ABC3이 됩니다. 대문자와 다른 공백은 마지막 묶음을 닫는 표시이며 출력하지 않습니다.
원래 길이만큼 순회하므로 시간 O(n), 센티널 문자열과 결과 조각을 포함한 추가 공간 O(n)입니다.
def solution(s):
answer = []
text = s + ' '
count = 1
for i in range(len(s)):
if text[i] == text[i + 1]:
count += 1
else:
answer.append(text[i])
if count > 1:
answer.append(str(count))
count = 1
return ''.join(answer)
str s를 solution(s)에 전달하고 압축한 str을 반환합니다. 예: solution("KKHSSSSSSSE") → "K2HS7E". input()과 print()는 필요하지 않습니다.
range(len(s))는 원래 문자열의 인덱스만 순회합니다. append()로 문자와 str(count)를 리스트에 모은 뒤 join()으로 합치므로 횟수와 문자열의 자료형이 섞이지 않습니다.
ABBA → AB2A에서 양끝 A는 따로 기록합니다. A → A처럼 1을 생략하고, ABCCC → ABC3처럼 끝 묶음도 공백 센티널과 비교해 기록합니다.
시간 O(n), 센티널 문자열·결과 리스트를 포함한 추가 공간 O(n)입니다.
class Solution {
public String solution(String s) {
StringBuilder answer = new StringBuilder();
String text = s + " ";
int count = 1;
for (int i = 0; i < s.length(); i++) {
if (text.charAt(i) == text.charAt(i + 1)) {
count++;
} else {
answer.append(text.charAt(i));
if (count > 1) answer.append(count);
count = 1;
}
}
return answer.toString();
}
}
new Solution().solution(String s)를 호출하고 압축한 String을 반환합니다. 예: new Solution().solution("KKHSSSSSSSE") → "K2HS7E". main과 표준 입력·출력은 필요하지 않습니다.
charAt(i)는 한 문자를 읽습니다. StringBuilder.append()는 문자와 정수 횟수를 결과 뒤에 붙이며, 정수 10도 두 자리 문자열로 기록합니다. 마지막에 toString()으로 String을 반환합니다.
ABBA → AB2A처럼 묶음 종료 뒤 count를 1로 초기화합니다. A → A는 횟수를 생략하고 ABCCC → ABC3은 끝의 공백 센티널 덕분에 마지막 묶음까지 처리합니다.
시간 O(n), 센티널 문자열·StringBuilder·반환 문자열을 포함한 추가 공간 O(n)입니다.
#include <string>
std::string solution(const std::string& s) {
std::string answer;
const std::string text = s + " ";
int count = 1;
for (std::size_t i = 0; i < s.size(); i++) {
if (text[i] == text[i + 1]) {
count++;
} else {
answer += text[i];
if (count > 1) answer += std::to_string(count);
count = 1;
}
}
return answer;
}
std::string solution(const std::string& s)를 호출하고 압축한 std::string을 반환합니다. 예: solution("KKHSSSSSSSE") → "K2HS7E". main과 표준 입력·출력은 필요하지 않습니다. C++11 이상을 사용합니다.
입력은 const 참조로 받아 불필요하게 복사하지 않습니다. text[i]로 대문자를 비교하고, std::to_string(count)로 반복 횟수를 문자열로 바꿔 붙입니다. std::size_t는 문자열 인덱스와 크기에 맞는 자료형입니다.
ABBA → AB2A처럼 떨어진 A는 합치지 않습니다. A → A는 1을 생략하고 ABCCC → ABC3은 공백 센티널로 마지막 묶음을 닫습니다.
문자열 뒤에 붙이는 비용을 포함한 시간은 O(n), 센티널과 결과 문자열을 포함한 추가 공간은 O(n)입니다.
using System.Text;
public class Solution {
public string Solve(string s) {
var answer = new StringBuilder();
string text = s + " ";
int count = 1;
for (int i = 0; i < s.Length; i++) {
if (text[i] == text[i + 1]) {
count++;
} else {
answer.Append(text[i]);
if (count > 1) answer.Append(count);
count = 1;
}
}
return answer.ToString();
}
}
new Solution().Solve(string s)를 호출하고 압축한 string을 반환합니다. 예: new Solution().Solve("KKHSSSSSSSE") → "K2HS7E". Main과 표준 입력·출력은 필요하지 않습니다.
s.Length로 원래 길이만큼 순회합니다. StringBuilder.Append()는 문자와 정수 횟수를 덧붙이고, ToString()은 최종 string을 만듭니다. 정수 횟수를 문자 코드로 바꾸지 않으므로 10이나 100도 그대로 기록됩니다.
ABBA → AB2A처럼 묶음이 끝나면 count를 1로 되돌립니다. A → A는 횟수를 생략하고 ABCCC → ABC3은 마지막 문자를 공백 센티널과 비교해 처리합니다.
시간 O(n), 센티널 문자열·StringBuilder·반환 문자열을 포함한 추가 공간 O(n)입니다.
접근 과정
count를 1로 시작합니다. 현재 문자를 이미 한 개 읽은 상태입니다.- 다음 문자도 같으면 count를 1 늘립니다.
- 다음 문자가 다르면 현재 문자와 횟수를 결과에 넣습니다. 횟수 1은 생략하고, 다음 묶음을 위해 count를 1로 되돌립니다.
마지막 문자 뒤에는 공백 한 칸을 붙입니다. 입력은 대문자만 있으므로 공백을 만나면 마지막 묶음도 끝납니다. 이렇게 끝을 알려 주는 표시가 센티널입니다. 반복문은 원래 문자까지만 읽으므로 공백은 결과에 들어가지 않습니다.
해설과 정답의 근거
count는 현재 묶음에서 지금까지 읽은 문자 수입니다. 같은 문자가 이어지면 수만 늘리고, 다른 문자를 만나면 그 묶음의 최종 횟수를 한 번 기록합니다. 이 과정을 반복하면 모든 묶음이 원래 순서대로 결과에 들어갑니다.
원본 TXT의 공백 센티널·다음 문자 비교·횟수 초기화를 유지했습니다. 변수 cnt는 count로 풀어 썼습니다. JavaScript와 Python은 결과 조각을 모아 합치고, Java와 C#은 StringBuilder를 사용합니다. C++은 결과 문자열 뒤에 붙입니다.
함수 결과를 한 줄로 출력하기
실습창에는 선택한 언어의 함수만 작성합니다. Node.js로 직접 실행하려면 해답 탭의 JavaScript 함수 뒤에 다음 코드를 붙여 solution.cjs로 저장하세요.
const fs = require('fs');
const input = fs.readFileSync(0, 'utf8').trim();
console.log(solution(input));
input.txt에 원본 예제를 적고 일반 터미널에서 node solution.cjs < input.txt를 실행합니다. PowerShell에서는 cmd /c "node solution.cjs < input.txt"를 사용합니다. 예상 출력은 K2HS7E입니다.
trim()은 입력의 끝 줄바꿈을 정리합니다. 대문자만 데이터인 이 문제에서 사용할 수 있으며, 공백 자체가 데이터인 문제에는 그대로 적용하지 않습니다.
예제 추적
| 묶음 | 끝을 확인한 다음 문자 | 결과에 붙일 값 |
|---|---|---|
| KK | H | K2 |
| H | S | H |
| SSSSSSS | E | S7 |
| E | 끝에 붙인 공백 | E |
결과는 K2HS7E입니다. 마지막 E도 공백과 다르므로 빠지지 않습니다.

경계값과 시간·공간 복잡도
다음은 직접 만든 확인 예제입니다.
A → A: 한 문자에는 횟수 1을 붙이지 않습니다.AAABAAA → A3BA3: 떨어진 두 A 묶음을 합치지 않습니다.ABCCC → ABC3: 마지막 반복 묶음도 기록합니다.- A 9개·10개·99개는 각각
A9·A10·A99입니다. - Z 100개는
Z100, AB를 50번 반복하면 입력 그대로입니다. - A 50개 뒤 B 50개는
A50B50입니다. 묶음마다 횟수를 새로 셉니다.
길이 n의 문자열을 한 번 순회하므로 시간 O(n)입니다. 결과를 합치거나 뒤에 붙이는 작업도 전체 길이에 비례합니다. 센티널 문자열과 결과 저장을 포함한 추가 공간은 O(n)입니다.
자가 확인
AAABAAA의 결과가 A6B가 아닌 A3BA3인 이유를 설명할 수 있나요?- 묶음 종료 뒤 count를 1로 되돌리지 않으면 무엇이 잘못되나요?
- 공백도 입력 문자로 허용한다면 마지막 묶음 처리를 어떻게 바꾸겠습니까?
원자료와 확인 범위
제공 학습 자료 섹션 3. 문자열 탐색.pdf 5쪽 「문자열 압축」과 5. 문자열 압축.txt를 기준으로 작성했습니다. 2026년 10월 15일 대조한 자료를 10월 19일 다시 확인했습니다. PDF는 문제 조건·예제, TXT는 HTML 안에서 함수를 호출하는 풀이 자료입니다.
별도의 공개 원문·온라인 채점 주소는 확인되지 않았습니다. 예제 확인과 로컬 코드 검증은 공식 채점 통과를 뜻하지 않습니다.
원자료의 다른 학습 순서 (선택)
문자열의 각 위치를 읽는 연습은 가장 짧은 문자거리 풀이에서 이어 볼 수 있습니다. 다음 원본 문제는 섹션 4의 “자릿수의 합”이며, 사이트의 자동 학습 이동은 현재 과정 순서에 따라 표시됩니다.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 전처리할 문자와 비교할 문자를 구분하고 마지막 문자·마지막 묶음을 확인하세요.
다음 추천 · 문제: 자릿수의 합: 동률이면 더 큰 수 고르기
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 57개 · 필수 57개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.