{ }codelper
문자열 바꾸기P0055

모두 찾아 바꾸기

첫 줄에 문자열 text, 둘째 줄에 찾을 말 a, 셋째 줄에 바꿀 말 b가 주어진다.
text 안의 a를 모두 b로 바꾼 문자열을 출력하라.
찾는 것은 원래 text에서 왼쪽부터 하고, 한 번 바꾼 부분은 다시 찾지 않는다.
그래서 "aaa"에서 "aa"를 "b"로 바꾸면 "ba"이고, "banana"에서 "a"를 "aa"로 바꾸면 "baanaanaa"다.
a와 b에 든 기호(.
$ ( \ 등)는 특별한 뜻 없이 그 글자 자체다.
a가 없으면 text를 그대로 출력한다.

입력
text는 빈칸(앞뒤 빈칸은 없음)과 키보드 기호를 포함한 영어 글자(ASCII 32~126), 길이 1 ~ 1,000.
a와 b는 빈칸 없는 ASCII 글자, 길이 1 ~ 10
출력
바꾼 문자열 한 줄
예시 1 · stdin
I like cats. cats are cute.
cats
dogs
stdout
I like dogs. dogs are cute.
예시 2 · stdin
a.b.c
.
$$
stdout
a$$b$$c
main.py
입력(stdin)

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

$ 준비됐어요

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

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

"모두 글자 그대로" 바꾸는 함수: Python text.replace(a, b), Java text.replace(a, b), C# text.Replace(a, b)(서수 비교), 크레이콘 text.바꾸기(a, b).
함정이 많은 쪽은 JS와 Java예요.
① JS·TS text.replace("cats", "dogs")는 문자열을 주면 처음 하나만 바꿔요.
② 모두 바꾸는 replaceAll(a, b)도 바꿀 말 속의 $&(찾은 말)·$$(달러 하나)를 특수 패턴으로 읽어서 "$$"가 "$"로 줄어요.
글자 그대로 바꾸려면 text.split(a).join(b)나 함수 () => b를 넘겨요.
③ Java replaceAll은 이름과 달리 첫 값을 정규식으로 읽어서 .은 아무 글자나 맞고, (는 PatternSyntaxException, 바꿀 말의 $1은 그룹 참조 오류예요.
그냥 모두 바꾸는 건 replace예요.
C와 C++에는 문자열 바꾸기 함수가 없어서 strstr/find로 찾아 앞부분 + b를 이어 붙이고, 찾은 말 바로 다음부터 다시 찾아요.
바꾼 결과에서 처음부터 다시 찾으면 "banana"의 a → aa처럼 바꿀 말이 찾을 말을 품을 때 끝나지 않아요.

Pythonmain.py · 4 줄
text = input()a = input()b = input()print(text.replace(a, b))
JavaScriptmain.js · 3 줄
const [text, a, b] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.replace(/\r$/, ""));// split/join은 글자를 그대로 쓴다(replaceAll의 둘째 값은 $& $$ 같은 특수 패턴을 해석한다)console.log(text.split(a).join(b));
TypeScriptmain.ts · 4 줄
import { readFileSync } from "node:fs";const [text, a, b]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.replace(/\r$/, ""));// split/join은 글자를 그대로 쓴다(replaceAll의 둘째 값은 $& $$ 같은 특수 패턴을 해석한다)console.log(text.split(a).join(b));
JavaMain.java · 13 줄
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 text = br.readLine();        String a = br.readLine();        String b = br.readLine();        // replace(CharSequence, CharSequence)는 글자 그대로, 모두 바꾼다(replaceAll은 정규식)        System.out.println(text.replace(a, b));    }}
C#Main.cs · 12 줄
using System; class Program{    static void Main()    {        string text = Console.ReadLine();        string a = Console.ReadLine();        string b = Console.ReadLine();        Console.WriteLine(text.Replace(a, b));    }}
C++main.cpp · 18 줄
#include <iostream>#include <string> int main() {    std::string text, a, b;    std::getline(std::cin, text);    std::getline(std::cin, a);    std::getline(std::cin, b);    std::string out;    size_t from = 0;    for (size_t at = text.find(a); at != std::string::npos; at = text.find(a, from)) {        out.append(text, from, at - from);        out += b;        from = at + a.size();    }    out.append(text, from, std::string::npos);    std::cout << out << "\n";}
Cmain.c · 23 줄
#include <stdio.h>#include <string.h> static void read_line(char *buf, int size) {    if (!fgets(buf, size, stdin)) buf[0] = '\0';    buf[strcspn(buf, "\r\n")] = '\0';} int main(void) {    char text[1005], a[16], b[16];    read_line(text, sizeof text);    read_line(a, sizeof a);    read_line(b, sizeof b);    size_t m = strlen(a);    const char *p = text;    for (const char *q = strstr(p, a); q != NULL; q = strstr(p, a)) {        fwrite(p, 1, (size_t)(q - p), stdout);  /* 찾은 곳 앞까지 */        fputs(b, stdout);        p = q + m;                              /* 찾은 말 다음부터 다시 */    }    puts(p);    return 0;}
Craykonmain.cray · 4 줄
text = 콘솔.줄읽기();a = 콘솔.줄읽기();b = 콘솔.줄읽기();콘솔.쓰기(text.바꾸기(a, b));