첫 줄에 문자열 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
오류 목록00F8 ↓ · ⇧F8 ↑
입력(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));}