{ }codelper
글자 번호P0283

대각선으로 뽑는 글자

쪽지에 낱말 n개가 한 줄에 하나씩 적혀 있다. 첫째 낱말에서는 첫째 글자를, 둘째 낱말에서는 둘째 글자를 뽑는 식으로, i째 낱말에서 i째 글자를 뽑는다. i째 낱말의 길이가 i보다 짧아서 뽑을 글자가 없으면 글자 대신 * 를 쓴다. 첫 줄에 n이 주어지고, 다음 n줄에 낱말이 하나씩 주어진다. 이렇게 얻은 n개를 첫째 낱말의 것부터 차례대로 빈칸 없이 이어 붙여 한 줄에 출력하라.

입력
1 ≤ n ≤ 100, 낱말은 영어 소문자만으로 된 길이 1 ~ 100의 문자열
출력
n글자짜리 문자열 한 줄(영어 소문자와 *)
예시 1 · stdin
4
cat
bone
do
gold
stdout
co*d
main.py
입력(stdin)

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

$ 준비됐어요

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

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

글자 번호는 8개 언어 모두 0부터 세요.
그래서 반복 변수 i를 0부터 돌리면 i째(사람이 세면 i + 1째) 낱말에서 word[i]를 뽑으면 되고, 쓸 수 있는 번호는 0부터 길이 - 1까지예요.
뽑기: Python·JS·TS·C#·C·C++·크레이콘 word[i], Java word.charAt(i).
길이: Python len(word), JS·TS word.length, Java word.length(), C# word.Length, C++ word.size(), C strlen(word), 크레이콘 word.길이.
범위 밖 번호를 읽을 때 일어나는 일이 언어마다 아주 달라요.
Python은 IndexError, Java는 StringIndexOutOfBoundsException, C#은 IndexOutOfRangeException으로 멈추고, 크레이콘도 "문자열에는 0~2번만 있어요"라며 멈춰요.
JS·TS의 word[i]는 멈추지 않고 undefined를 줘서 답에 "undefined"라는 문자열이 붙어요(word.charAt(i)는 빈 문자열).
C는 검사하지 않고 배열에 남아 있던 앞 낱말의 글자나 끝 표시 \0을 그대로 내놓아요.
C++ word[i]도 검사하지 않고, word.at(i)를 써야 std::out_of_range를 던져요.
그래서 뽑기 전에 i < 길이인지 먼저 물어요.
함정 둘: ① i <= 길이로 물으면 길이가 꼭 i인 낱말에서 범위를 벗어나요.
② 사람이 세는 번호(1부터)를 그대로 word[i]에 쓰면 한 칸 뒤의 글자가 나와요.

Pythonmain.py · 9 줄
n = int(input())answer = ""for i in range(n):    word = input().strip()    if i < len(word):       # 번호는 0부터라서 i째 낱말의 글자 번호는 0 ~ len - 1        answer += word[i]    else:        answer += "*"print(answer)
JavaScriptmain.js · 9 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);let answer = "";for (let i = 0; i < n; i++) {  const word = lines[i + 1].trim();  // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ length - 1  answer += i < word.length ? word[i] : "*";}console.log(answer);
TypeScriptmain.ts · 10 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);let answer = "";for (let i = 0; i < n; i++) {  const word: string = lines[i + 1].trim();  // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ length - 1  answer += i < word.length ? word[i] : "*";}console.log(answer);
JavaMain.java · 17 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(in.readLine().trim());        StringBuilder answer = new StringBuilder();        for (int i = 0; i < n; i++) {            String word = in.readLine().trim();            // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ length() - 1            answer.append(i < word.length() ? word.charAt(i) : '*');        }        System.out.println(answer);    }}
C#Main.cs · 18 줄
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        var answer = new StringBuilder();        for (int i = 0; i < n; i++)        {            string word = Console.ReadLine().Trim();            // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ Length - 1            answer.Append(i < word.Length ? word[i] : '*');        }        Console.WriteLine(answer);    }}
C++main.cpp · 16 줄
#include <iostream>#include <string> int main() {    int n;    std::cin >> n;    std::string answer;    for (int i = 0; i < n; i++) {        std::string word;        std::cin >> word;        // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ size() - 1        if (i < static_cast<int>(word.size())) answer += word[i];        else answer += '*';    }    std::cout << answer << '\n';}
Cmain.c · 16 줄
#include <stdio.h>#include <string.h> int main(void) {    int n;    if (scanf("%d", &n) != 1) return 0;    char word[101];    for (int i = 0; i < n; i++) {        if (scanf("%100s", word) != 1) return 0;        // C는 범위를 검사해 주지 않으니 길이를 직접 물어야 한다        if (i < (int)strlen(word)) putchar(word[i]);        else putchar('*');    }    putchar('\n');    return 0;}
Craykonmain.cray · 16 줄
n = 콘솔.줄읽기().수로변환();answer = "";반복 (i = 0; i < n; i++){    word = 콘솔.줄읽기().공백제거();    // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ 길이 - 1    만약 (i < word.길이)    {        answer += word[i];    }    아니면    {        answer += "*";    }}콘솔.쓰기(answer);