읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 문자열 알고리즘 기초: 순회·문자 판별·대소문자 변환·숫자 추출문자열의 각 문자를 순서대로 읽고 위치를 확인하는 방법을 복습합니다. 문자 비교와 빈도 누적을 분리합니다.
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신변수에 값을 담고 조건에 따라 합·개수·최솟값을 갱신하는 기초부터 확인합니다. 순회 중 필요한 상태를 정하고 갱신하는 기본 패턴입니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 문자열 기초 · 문제
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
문자 찾기 문제는 문자열과 찾을 문자를 입력받아 무엇을 구하나요?
문자열과 찾을 문자를 입력받아 해당 문자가 나온 횟수를 구하는 문제입니다. 문자열·조건문·개수의 기본을 준비하고, 아래 입력·반환 계약을 확인해 직접 풀어보세요.
적용 조건·범위: 입력은 첫째 줄의 문자열과 둘째 줄의 문자로 구성됩니다. 출력은 해당 문자의 등장 횟수 하나입니다. 대소문자를 같은 문자로 취급한다는 조건은 없으므로 입력에 적힌 문자를 그대로 비교해야 합니다.
공식 문서 참고: 관련 개념: MDN 문자열의 for...of 순회
문제
길이가 100 이하인 문자열 한 개와 찾을 문자 한 개가 차례로 주어집니다. 문자열을 처음부터 끝까지 확인하여 지정된 문자가 몇 번 등장하는지 구하고, 그 개수를 출력하는 문제입니다.
입력은 첫째 줄의 문자열과 둘째 줄의 문자로 구성됩니다. 출력은 해당 문자의 등장 횟수 하나입니다. 대소문자를 같은 문자로 취급한다는 조건은 없으므로 입력에 적힌 문자를 그대로 비교해야 합니다.
예제 입력
COMPUTERPROGRAMMING
R
예제 출력
3
직접 풀어보기
먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.
AI 힌트
코드를 실행한 채점 결과가 아닌 AI의 코드 분석입니다.
해답·해설 보기
function solution(text, target) {
let count = 0;
for (const ch of text) if (ch === target) count++;
return count;
}
solution(text, target)에 문자열과 한 코드포인트 문자열을 전달하며 등장 횟수를 숫자로 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
def solution(text, target):
count = 0
for ch in text:
if ch == target: count += 1
return count
solution(text, target)에 문자열과 한 코드포인트 문자열을 전달하며 등장 횟수를 int로 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
import java.util.*;
class Solution {
public int solution(String text, String target) {
int count = 0, targetPoint = target.codePointAt(0);
for (int i = 0; i < text.length();) {
int point = text.codePointAt(i);
if (point == targetPoint) count++;
i += Character.charCount(point);
}
return count;
}
}
Solution.solution(String text, String target)에 한 코드포인트 target을 전달하며 int를 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <limits>
#include <memory>
#include <numeric>
#include <queue>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
using namespace std;
int solution(const string & text, const string & target) {
int count = 0;
for (size_t i = 0; i < text.size();) {
unsigned char ch = static_cast < unsigned char >(text[i]);
size_t width = ch < 0x80 ? 1 : ch < 0xE0 ? 2 : ch < 0xF0 ? 3 : 4;
if (text.compare(i, width, target) == 0) count++;
i += width;
}
return count;
}
solution(text,target)는 int를 반환합니다. 두 문자열은 UTF-8이며 target은 한 코드포인트입니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
using System;
using System.Collections.Generic;
using System.Text;
public class Solution {
public int Solve(string text, string target) {
int count = 0;
for (int i = 0; i < text.Length;) {
int width = char.IsHighSurrogate(text[i]) ? 2 : 1;
if (target.Length == width && string.CompareOrdinal(text, i, target, 0, width) == 0) count++;
i += width;
}
return count;
}
}
Solution.Solve(string text,string target)는 int를 반환합니다. target은 한 Unicode 코드포인트를 담은 문자열입니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
원자료와 확인 범위
2026-10-12에 제공된 학습 자료 섹션 1. 기본문제풀이.pdf의 10쪽 ‘문자 찾기’와 문제 조건·예제를 대조했습니다. 같은 ZIP의 해당 문제 TXT는 풀이 코드 자료입니다. 이 자료의 최초 출제 원문·저자·공개 배포 주소까지 확인한 것은 아닙니다.
이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.
문자열을 한 번 훑으며 찾을 문자와 같을 때만 개수를 늘립니다. 대소문자를 바꾸지 않고 입력 그대로 비교합니다.
알고리즘 설계

count를 0으로 시작하고 for...of로 문자를 하나씩 확인합니다. 현재 문자가 target과 같으면 1을 더합니다. 각 위치를 정확히 한 번 확인하므로 같은 문자가 연속되어도 빠짐없이 셀 수 있습니다.
목표 문자로 split한 배열의 길이에서 1을 빼는 방법도 있지만, 직접 순회하면 중간 배열을 만들지 않아도 됩니다.

Node.js에서 실행하는 완성 코드입니다. 첫째 줄과 둘째 줄을 분리할 때 일반 줄바꿈과 Windows 줄바꿈을 모두 처리합니다.
아래 Node.js 완성 코드를 solution.cjs로 저장하고 input.txt의 첫 줄에는 COMPUTERPROGRAMMING, 둘째 줄에는 R을 씁니다. 이 파서는 두 줄을 구분하므로 문자열과 찾을 문자를 한 줄에 합치지 않습니다. Bash·명령 프롬프트에서는 node solution.cjs < input.txt, PowerShell에서는 cmd /c “node solution.cjs < input.txt”로 실행합니다. 기대 출력 3을 문자열에서 직접 표시한 R 세 개와 비교하세요.
const fs = require('fs');
function solution(str, target) {
let count = 0;
for (const char of str) {
if (char === target) {
count++;
}
}
return count;
}
const lines = fs.readFileSync(0, 'utf8').split(/\r?\n/);
const str = lines[0];
const target = lines[1];
console.log(solution(str, target));
lines[0]은 전체 문자열, lines[1]은 찾을 문자입니다. 정규식의 백슬래시가 빠지면 줄바꿈을 나누지 못하므로 코드를 저장하거나 복사한 뒤에도 이 부분을 확인해야 합니다.
COMPUTERPROGRAMMING을 순회하면 첫 R에서 1, 다음 R에서 2, 마지막 R에서 3이 됩니다. 다른 문자는 개수를 바꾸지 않습니다.
복잡도와 검증
문자열 길이를 N이라 하면 풀이 함수의 시간 복잡도는 O(N), 입력을 제외한 추가 공간은 O(1)입니다. 표준 입력을 읽고 줄별 문자열을 만드는 과정까지 포함하면 O(N) 공간이 필요합니다.
| 입력 문자열 | 찾을 문자 | 출력 |
|---|---|---|
| COMPUTERPROGRAMMING | R | 3 |
| AAAA | A | 4 |
| ABC | Z | 0 |
저장된 완성 코드로 위 세 경우와 Windows 줄바꿈 입력을 실행해 결과가 일치함을 확인했습니다.
이 문제를 푼 뒤 확인하기
찾는 문자가 없는 경우와 모든 문자가 같은 경우를 비교해 보세요.
본문의 예제와 이 반례를 직접 실행해 예상 출력과 비교하고, 결과가 다르면 입력 조건과 반복 범위를 다시 확인하세요.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 같은 문자·찾는 문자 없음·홀짝 길이를 확인하고 결과의 등장 순서를 설명하세요.
다음 추천 · 문제: 대문자 찾기 풀이
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 58개 · 필수 58개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.