{ }codelper
문자열 반복글자 코드P0097

글자 피라미드

영어 대문자 하나 C가 주어진다.
A부터 C까지 k + 1줄(k는 C가 A에서 떨어진 칸 수, A이면 0)의 글자 피라미드를 출력하라.
위에서 i번째 줄(0부터)은 빈칸 k - i개, 그다음 A부터 A에서 i칸 뒤 글자까지 차례로, 그다음 그 바로 앞 글자부터 거꾸로 A까지다.
예를 들어 C = D이면 마지막 줄은 "ABCDCBA"다.
줄 끝에는 빈칸을 넣지 않는다.

입력
C는 A부터 Z까지의 대문자 하나
출력
k + 1줄의 피라미드
예시 1 · stdin
D
stdout
   A
  ABA
 ABCBA
ABCDCBA
예시 2 · stdin
A
stdout
A
main.py
입력(stdin)

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

$ 준비됐어요

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

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

글자를 수로 바꿔 더한 다음 다시 글자로 돌리는 방법이 언어마다 달라요.
Python chr(ord("A") + j), JS·TS String.fromCharCode(65 + j).
JS에서 "A" + 1은 계산이 아니라 문자열 잇기라 "A1"이 돼요.
C·C++·Java·C#에서 'A' + j는 int예요.
C의 putchar는 int를 글자로 찍지만, C++ cout << 'A' + j와 Java StringBuilder.append('A' + j)는 65처럼 수를 찍어요.
(char)나 static_cast<char>로 되돌려야 해요.
같은 글자를 되풀이하는 방법도 달라요.
Python " " * n, JS·TS·Java(11부터) " ".repeat(n), C# new string(' ', n), C++ std::string(n, ' ').
C에는 되풀이 함수가 없어서 반복문을 쓰거나 printf("%*s", n, "")로 너비만큼 빈칸을 찍어요.
크레이콘은 글자.코드("A")로 수를 얻고 글자.글자로변환(a + j)로 되돌리며, 빈칸은 " ".되풀이(k - i)로 만들어요.

Pythonmain.py · 5 줄
k = ord(input().strip()) - ord("A")for i in range(k + 1):    up = "".join(chr(ord("A") + j) for j in range(i + 1))    # 올라간 글자 + 마지막 글자를 뺀 거꾸로    print(" " * (k - i) + up + up[-2::-1])
JavaScriptmain.js · 9 줄
const k = require("fs").readFileSync(0, "utf8").trim().charCodeAt(0) - 65;const lines = [];for (let i = 0; i <= k; i++) {  let up = "";  for (let j = 0; j <= i; j++) up += String.fromCharCode(65 + j);  const down = up.slice(0, -1).split("").reverse().join("");  lines.push(" ".repeat(k - i) + up + down);}console.log(lines.join("\n"));
TypeScriptmain.ts · 10 줄
import { readFileSync } from "node:fs";const k: number = readFileSync(0, "utf8").trim().charCodeAt(0) - 65;const lines: string[] = [];for (let i = 0; i <= k; i++) {  let up = "";  for (let j = 0; j <= i; j++) up += String.fromCharCode(65 + j);  const down: string = up.slice(0, -1).split("").reverse().join("");  lines.push(" ".repeat(k - i) + up + down);}console.log(lines.join("\n"));
JavaMain.java · 16 줄
import java.util.Scanner; public class Main {    public static void main(String[] args) {        int k = new Scanner(System.in).next().charAt(0) - 'A';        StringBuilder out = new StringBuilder();        for (int i = 0; i <= k; i++) {            out.append(" ".repeat(k - i));            // 'A' + j 는 int라서 (char)로 되돌려야 글자로 붙는다            for (int j = 0; j <= i; j++) out.append((char) ('A' + j));            for (int j = i - 1; j >= 0; j--) out.append((char) ('A' + j));            out.append('\n');        }        System.out.print(out);    }}
C#Main.cs · 20 줄
using System;using System.Text; class Program{    static void Main()    {        int k = Console.ReadLine().Trim()[0] - 'A';        var output = new StringBuilder();        for (int i = 0; i <= k; i++)        {            output.Append(new string(' ', k - i));            // 'A' + j 는 int라서 (char)로 되돌려야 글자로 붙는다            for (int j = 0; j <= i; j++) output.Append((char)('A' + j));            for (int j = i - 1; j >= 0; j--) output.Append((char)('A' + j));            output.Append('\n');        }        Console.Write(output);    }}
C++main.cpp · 15 줄
#include <iostream>#include <string> int main() {    char c;    std::cin >> c;    int k = c - 'A';    for (int i = 0; i <= k; i++) {        std::string line(k - i, ' ');        // 'A' + j 는 int라서 char로 되돌려 붙인다        for (int j = 0; j <= i; j++) line += static_cast<char>('A' + j);        for (int j = i - 1; j >= 0; j--) line += static_cast<char>('A' + j);        std::cout << line << '\n';    }}
Cmain.c · 15 줄
#include <stdio.h> int main(void) {    char c;    scanf(" %c", &c);    int k = c - 'A';    for (int i = 0; i <= k; i++) {        // C에는 되풀이 함수가 없다: %*s 에 빈 문자열을 주면 그 너비만큼 빈칸이 찍힌다        printf("%*s", k - i, "");        for (int j = 0; j <= i; j++) putchar('A' + j);        for (int j = i - 1; j >= 0; j--) putchar('A' + j);        putchar('\n');    }    return 0;}
Craykonmain.cray · 15 줄
a = 글자.코드("A");k = 글자.코드(콘솔.줄읽기().공백제거()) - a;반복 (i = 0; i <= k; i++){    line = " ".되풀이(k - i);    반복 (j = 0; j <= i; j++)    {        line += 글자.글자로변환(a + j);    }    반복 (j = i - 1; j >= 0; j--)    {        line += 글자.글자로변환(a + j);    }    콘솔.쓰기(line);}