친구가 긴 문자열 하나와 글자 번호들로 된 쪽지를 보냈다.
첫 줄에 영어 소문자로 된 문자열 s가, 둘째 줄에 번호의 개수 q가, 셋째 줄에 번호 q개가 빈칸으로 띄워 주어진다.
번호 k가 양수이면 s의 앞에서 k번째 글자를 뜻한다. 맨 앞 글자가 1번째이다.
번호 k가 음수이면 s의 뒤에서 -k번째 글자를 뜻한다. 맨 끝 글자가 -1이고, 그 앞 글자가 -2이다.
번호는 0이 아니고, 언제나 s 안의 글자를 가리킨다.
번호들이 가리키는 글자를 주어진 차례대로 이어 붙인 문자열을 한 줄에 출력하라.
입력
1 ≤ s의 길이 ≤ 1,000, s는 영어 소문자만, 1 ≤ q ≤ 1,000, 1 ≤ |k| ≤ s의 길이
출력
q글자짜리 문자열 한 줄
예시 1 · stdin
secretnote
4
3 -3 7 -1
stdout
cone
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
"앞에서 k번째"는 사람이 1부터 센 번호이고, 여덟 언어의 문자열 번호는 모두 0부터예요. 그래서 양수는 모든 언어에서 s[k - 1]이에요(Java는 s.charAt(k - 1)). 뒤에서 세는 번호는 언어마다 달라요. Python은 s[-1]이 바로 맨 끝 글자라서 음수를 그대로 쓰면 돼요. 이때 양수처럼 1을 빼면(s[k - 1]) 한 칸씩 밀려요. C#은 s[^1]처럼 ^를 붙인 끝에서부터의 번호가 있어요. JS·TS의 s[-1]은 오류 없이 undefined를 주고, 이어 붙이면 "undefined"라는 글자가 끼어들어요. s.at(-1)은 뒤에서 세어 줘요. Java charAt(-1)은 예외, C s[-1]과 C++ s[-1]은 배열 밖을 읽는 정해지지 않은 동작이에요. 크레이콘 s[-1]은 "0~n번만 있어요" 실행 오류로 멈춰요. 이런 언어에서는 길이를 더해 s[len + k](크레이콘 s[s.길이 + k])로 바꿔요.
Pythonmain.py · 9 줄
s = input().strip()q = int(input())out = []for k in map(int, input().split()): if k > 0: out.append(s[k - 1]) # 앞에서 k번째 → 번호는 k - 1 else: out.append(s[k]) # Python은 s[-1]이 맨 끝 글자print("".join(out))
JavaScriptmain.js · 9 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const s = lines[0].trim();const ks = lines[2].trim().split(/\s+/).map(Number);let out = "";for (const k of ks) { // s[-1]은 undefined라서 음수는 길이를 더해 번호로 바꾼다(s.at(k)도 된다) out += k > 0 ? s[k - 1] : s[s.length + k];}console.log(out);
TypeScriptmain.ts · 10 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const s = lines[0].trim();const ks: number[] = lines[2].trim().split(/\s+/).map(Number);let out = "";for (const k of ks) { // s[-1]은 undefined라서 음수는 길이를 더해 번호로 바꾼다(s.at(k)도 된다) out += k > 0 ? s[k - 1] : s[s.length + k];}console.log(out);
JavaMain.java · 17 줄
import java.io.BufferedReader;import java.io.InputStreamReader;public class Main { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String s = in.readLine().trim(); in.readLine(); StringBuilder out = new StringBuilder(); for (String t : in.readLine().trim().split("\\s+")) { int k = Integer.parseInt(t); // charAt은 0부터, 음수는 받지 않는다 → 뒤에서 세면 길이를 더한다 out.append(k > 0 ? s.charAt(k - 1) : s.charAt(s.length() + k)); } System.out.println(out); }}
C#Main.cs · 19 줄
using System;using System.Text;class Program{ static void Main() { string s = Console.ReadLine().Trim(); Console.ReadLine(); var sb = new StringBuilder(); foreach (string t in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries)) { int k = int.Parse(t); // s[^m]은 뒤에서 m번째 글자(C# 8 이후) — ^1이 맨 끝 sb.Append(k > 0 ? s[k - 1] : s[^(-k)]); } Console.WriteLine(sb); }}
C++main.cpp · 16 줄
#include <iostream>#include <string>int main() { std::string s, out; int q; std::cin >> s >> q; int len = (int)s.size(); for (int i = 0; i < q; i++) { int k; std::cin >> k; // s[-1]은 정해지지 않은 동작 → 뒤에서 세면 길이를 더한다 out += k > 0 ? s[k - 1] : s[len + k]; } std::cout << out << '\n';}
Cmain.c · 19 줄
#include <stdio.h>#include <string.h>int main(void) { static char s[1001]; static char out[1001]; int q; scanf("%1000s %d", s, &q); int len = (int)strlen(s); for (int i = 0; i < q; i++) { int k; scanf("%d", &k); /* C 배열은 0부터, 음수 번호는 배열 밖을 읽는다 → 길이를 더해 바꾼다 */ out[i] = k > 0 ? s[k - 1] : s[len + k]; } out[q] = '\0'; puts(out); return 0;}
Craykonmain.cray · 16 줄
s = 콘솔.줄읽기().공백제거();q = 콘솔.줄읽기().수로변환();ks = 콘솔.수들읽기();out = "";각각 (k 에서 ks){ 만약 (k > 0) { out = out + s[k - 1]; // 앞에서 k번째 → 번호는 k - 1 } 아니면 { out = out + s[s.길이 + k]; // s[-1]은 오류라서 길이를 더한다 }}콘솔.쓰기(out);