{ }codelper
글자 번호P0192

쪽지 속 글자 번호

친구가 긴 문자열 하나와 글자 번호들로 된 쪽지를 보냈다. 첫 줄에 영어 소문자로 된 문자열 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
입력(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);