{ }codelper
대문자·소문자P0230

대소문자 무늬 옮겨 찍기

간판 가게는 손님이 고른 무늬 단어의 대문자·소문자 모양을 새 단어에 그대로 옮겨 찍어 준다. 첫 줄에 단어 쌍의 수 n이, 다음 n줄에 쌍마다 무늬 단어 p와 대상 단어 w가 빈칸 하나로 띄워 주어진다. w의 i번째 글자(0부터 센다)는 p의 (i를 p의 길이로 나눈 나머지)번째 글자를 따른다.
그래서 p가 w보다 짧으면 p의 무늬가 처음부터 되풀이된다. 따르는 p의 글자가 영어 대문자이면 w의 글자를 대문자로, 영어 소문자이면 소문자로 바꾼다. 따르는 p의 글자가 숫자이면 w의 글자를 바꾸지 않는다. w의 숫자는 무늬와 상관없이 늘 그대로이고, 이미 대문자인 글자를 대문자로 바꾸면 그대로다. 쌍마다 바꾼 w를 한 줄에 출력하라.

입력
1 ≤ n ≤ 1,000.
p와 w는 영어 대문자·소문자·숫자로 된 1~20글자다
출력
n줄, 줄마다 바꾼 w
예시 1 · stdin
3
HeLLo worlds
Ab codelper
x9Y PIZZA42
stdout
WoRLdS
CoDeLpEr
pIZzA42
main.py
입력(stdin)

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

$ 준비됐어요

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

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

대문자인지 묻는 방법과 바꾸는 방법이 언어마다 달라요.
Python m.isupper()·islower(), Java Character.isUpperCase, C# char.IsUpper, C·C++ <ctype.h>의 isupper·toupper는 글자 하나를 다루고, JS·TS·크레이콘에는 그런 함수가 없어서 m >= "A" && m <= "Z"처럼 범위로 비교해요.
흔한 함정은 m == m.upper()(JS m === m.toUpperCase())로 대문자를 가리는 거예요.
숫자는 대문자로 바꿔도 그대로라서 "7"이 대문자로 쳐져요.
바꾸는 쪽은 Python upper(), JS·TS toUpperCase(), 크레이콘 대문자로변환()이 영어 글자가 아닌 것을 그대로 두니 걱정이 없어요.
C에서 w[i] - 32로 직접 바꾸면 이미 대문자인 글자나 숫자가 망가지니 toupper를 쓰거나 범위부터 확인해요.
C++ std::toupper는 int를 돌려줘서 std::cout << std::toupper(c)는 "65" 같은 수를 찍으니 char로 되돌려요.
Java String.toUpperCase()와 C# char.ToUpper는 지역(문화권) 설정을 따라 터키어에서는 i가 İ가 되니, 영어 글자만 다룰 때는 Java Character.toUpperCase(char)나 C# ToUpperInvariant가 안전해요.
무늬를 되풀이하는 자리는 i % p.length예요.

Pythonmain.py · 12 줄
n = int(input())for _ in range(n):    p, w = input().split()    out = []    for i, ch in enumerate(w):        m = p[i % len(p)]          # 무늬가 짧으면 처음부터 되풀이        if m.isupper():            # "7".isupper()는 False — 숫자는 대문자도 소문자도 아니다            ch = ch.upper()        elif m.islower():            ch = ch.lower()        out.append(ch)    print("".join(out))
JavaScriptmain.js · 18 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const isUpper = (c) => c >= "A" && c <= "Z";const isLower = (c) => c >= "a" && c <= "z";const out = [];for (let k = 1; k <= n; k++) {  const [p, w] = lines[k].trim().split(" ");  let s = "";  for (let i = 0; i < w.length; i++) {    const m = p[i % p.length];    // "7" === "7".toUpperCase()도 참이라, 같은지로 대문자를 가리면 숫자가 대문자로 친다    if (isUpper(m)) s += w[i].toUpperCase();    else if (isLower(m)) s += w[i].toLowerCase();    else s += w[i];  }  out.push(s);}console.log(out.join("\n"));
TypeScriptmain.ts · 18 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const isUpper = (c: string): boolean => c >= "A" && c <= "Z";const isLower = (c: string): boolean => c >= "a" && c <= "z";const out: string[] = [];for (let k = 1; k <= n; k++) {  const [p, w]: string[] = lines[k].trim().split(" ");  let s = "";  for (let i = 0; i < w.length; i++) {    const m: string = p[i % p.length];    if (isUpper(m)) s += w[i].toUpperCase();    else if (isLower(m)) s += w[i].toLowerCase();    else s += w[i];  }  out.push(s);}console.log(out.join("\n"));
JavaMain.java · 25 줄
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));        int n = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int k = 0; k < n; k++) {            String[] parts = br.readLine().trim().split(" ");            String p = parts[0];            String w = parts[1];            for (int i = 0; i < w.length(); i++) {                char m = p.charAt(i % p.length());                char c = w.charAt(i);                // Character.toUpperCase(char)는 지역 설정과 상관없다(String.toUpperCase()는 지역 설정을 따른다)                if (Character.isUpperCase(m)) c = Character.toUpperCase(c);                else if (Character.isLowerCase(m)) c = Character.toLowerCase(c);                out.append(c);            }            out.append('\n');        }        System.out.print(out);    }}
C#Main.cs · 27 줄
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine().Trim());        var sb = new StringBuilder();        for (int k = 0; k < n; k++)        {            string[] parts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            string p = parts[0], w = parts[1];            for (int i = 0; i < w.Length; i++)            {                char m = p[i % p.Length];                char c = w[i];                // char.ToUpper(c)는 지금 문화권을 따른다. 영어 글자만 다룰 때는 ToUpperInvariant가 안전하다                if (char.IsUpper(m)) c = char.ToUpperInvariant(c);                else if (char.IsLower(m)) c = char.ToLowerInvariant(c);                sb.Append(c);            }            sb.Append('\n');        }        Console.Write(sb);    }}
C++main.cpp · 21 줄
#include <cctype>#include <iostream>#include <string> int main() {    std::ios::sync_with_stdio(false);    int n;    std::cin >> n;    for (int k = 0; k < n; k++) {        std::string p, w;        std::cin >> p >> w;        for (std::size_t i = 0; i < w.size(); i++) {            unsigned char m = p[i % p.size()];            unsigned char c = w[i];            // std::toupper는 int를 돌려주므로 char로 되돌려 담는다            if (std::isupper(m)) w[i] = static_cast<char>(std::toupper(c));            else if (std::islower(m)) w[i] = static_cast<char>(std::tolower(c));        }        std::cout << w << '\n';    }}
Cmain.c · 21 줄
#include <ctype.h>#include <stdio.h>#include <string.h> int main(void) {    int n;    scanf("%d", &n);    for (int k = 0; k < n; k++) {        char p[32], w[32];        scanf("%31s %31s", p, w);        size_t lp = strlen(p);        for (size_t i = 0; w[i] != '\0'; i++) {            unsigned char m = (unsigned char)p[i % lp];            /* toupper·tolower는 영어 글자가 아니면 그대로 돌려준다 */            if (isupper(m)) w[i] = (char)toupper((unsigned char)w[i]);            else if (islower(m)) w[i] = (char)tolower((unsigned char)w[i]);        }        puts(w);    }    return 0;}
Craykonmain.cray · 26 줄
n = 콘솔.줄읽기().수로변환();반복 (k = 0; k < n; k++){    parts = 콘솔.줄읽기().공백제거().나누기(" ");    p = parts[0];    w = parts[1];    s = "";    반복 (i = 0; i < w.길이; i++)    {        m = p[i % p.길이];        // 숫자는 대문자로 바꿔도 그대로라서, 크기 비교로 영어 글자인지부터 가린다        만약 (m >= "A" && m <= "Z")        {            s = s + w[i].대문자로변환();        }        아니면 만약 (m >= "a" && m <= "z")        {            s = s + w[i].소문자로변환();        }        아니면        {            s = s + w[i];        }    }    콘솔.쓰기(s);}