{ }codelper
문자열 자르기P0054

몇째부터 몇째 글자까지 잘라 내기

첫 줄에 문자열 s, 둘째 줄에 질문 수 q가 주어진다.
이어서 q줄에 걸쳐 두 수 a, b가 주어진다.
질문마다 s의 a번째 글자부터 b번째 글자까지(두 끝 글자를 모두 넣어) 잘라 낸 문자열을 한 줄에 출력하라.
이 문제에서 자리는 사람이 세듯 1부터 센다.
예를 들어 s가 "codelper"이고 a = 1, b = 4이면 "code"다.

입력
s는 영어 소문자와 숫자, 길이 1 ~ 1,000.
1 ≤ q ≤ 1,000.
1 ≤ a ≤ b ≤ s의 길이
출력
q줄, 질문마다 잘라 낸 문자열
예시 1 · stdin
codelper
3
1 4
5 8
3 3
stdout
code
lper
d
main.py
입력(stdin)

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

$ 준비됐어요

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

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

자르는 함수의 둘째 값이 언어마다 뜻이 달라요.
끝 자리(그 자리는 빼고): Python s[a-1:b], JS·TS s.slice(a - 1, b), Java s.substring(a - 1, b).
글자 수: C# s.Substring(a - 1, b - a + 1), C++ s.substr(a - 1, b - a + 1), 크레이콘 s.부분문자열(a - 1, b - a + 1).
C는 자르는 함수 없이 printf("%.*s", b - a + 1, s + a - 1)처럼 시작 포인터와 글자 수로 찍어요.
함정 셋: ① 1부터 센 자리를 0부터 세는 번호로 바꾸지 않으면(s[a:b]) 한 칸씩 밀려요.
② Java substring에 글자 수를 넣거나 C# Substring에 끝 자리를 넣으면 다른 문자열이 나오거나 범위 밖 예외가 나요.
③ C++ substr은 개수가 너무 크면 오류 없이 끝까지 잘라 와서 틀린 줄 모르기 쉬워요(Python 슬라이스도 범위를 넘으면 조용히 잘라요).
JS의 substr(시작, 개수)는 오래된 함수라 쓰지 말고, substring은 두 값이 거꾸로면 알아서 바꿔 주는 점이 slice와 달라요.

Pythonmain.py · 5 줄
s = input()q = int(input())for _ in range(q):    a, b = map(int, input().split())    print(s[a - 1:b])
JavaScriptmain.js · 7 줄
const [s, q, ...rest] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out = [];for (let i = 0; i < Number(q); i++) {  const [a, b] = rest[i].split(" ").map(Number);  out.push(s.slice(a - 1, b));}console.log(out.join("\n"));
TypeScriptmain.ts · 8 줄
import { readFileSync } from "node:fs";const [s, q, ...rest]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out: string[] = [];for (let i = 0; i < Number(q); i++) {  const [a, b]: number[] = rest[i].split(" ").map(Number);  out.push(s.slice(a - 1, b));}console.log(out.join("\n"));
JavaMain.java · 17 줄
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();        int q = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < q; i++) {            String[] p = br.readLine().trim().split(" ");            int a = Integer.parseInt(p[0]), b = Integer.parseInt(p[1]);            out.append(s.substring(a - 1, b)).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 19 줄
using System;using System.Text; class Program{    static void Main()    {        string s = Console.ReadLine().Trim();        int q = int.Parse(Console.ReadLine());        var out_ = new StringBuilder();        for (int i = 0; i < q; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            int a = int.Parse(p[0]), b = int.Parse(p[1]);            out_.Append(s.Substring(a - 1, b - a + 1)).Append('\n');        }        Console.Write(out_);    }}
C++main.cpp · 13 줄
#include <iostream>#include <string> int main() {    std::ios::sync_with_stdio(false);    std::string s;    int q, a, b;    std::cin >> s >> q;    for (int i = 0; i < q; i++) {        std::cin >> a >> b;        std::cout << s.substr(a - 1, b - a + 1) << '\n';    }}
Cmain.c · 12 줄
#include <stdio.h> int main(void) {    char s[1001];    int q, a, b;    if (scanf("%1000s %d", s, &q) != 2) return 0;    for (int i = 0; i < q; i++) {        scanf("%d %d", &a, &b);        printf("%.*s\n", b - a + 1, s + a - 1);    }    return 0;}
Craykonmain.cray · 9 줄
s = 콘솔.줄읽기().공백제거();q = 콘솔.줄읽기().수로변환();반복 (i = 0; i < q; i++){    ab = 콘솔.수들읽기();    a = ab[0];    b = ab[1];    콘솔.쓰기(s.부분문자열(a - 1, b - a + 1));}