友だちどうしでメモをやり取りするときに使う暗号がある。 単語の長さを L とし、L を 2 で割った商を h とする。 単語の前の h 文字を逆順に書き、後ろの h 文字も別に逆順に書く。 L が奇数ならちょうど真ん中に 1 文字残るが、この文字はそのままの位置に置く。 たとえば notebook は note と book をそれぞれ逆にして etonkoob になる。 pencils は pen と ils をそれぞれ逆にし、真ん中の c はそのままにして nepcsli になる。 だから長さが 3 以下の単語は暗号にしても変わらない。 一行目に単語の数 n が、続く n 行に単語が一つずつ与えられる。 単語ごとに、暗号にした文字列を一行に出力せよ。
n = int(input())for _ in range(n): s = input().strip() h = len(s) // 2 # 앞쪽 h글자, 한가운데(길이가 홀수일 때만 한 글자), 뒤쪽 h글자 front, middle, back = s[:h], s[h:len(s) - h], s[len(s) - h:] # [::-1]은 거꾸로 읽은 새 문자열을 만든다 print(front[::-1] + middle + back[::-1])
JavaScriptmain.js · 15 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);// 문자열에는 reverse가 없어서 글자 배열로 바꿔 뒤집고 다시 잇는다const reversed = (t) => [...t].reverse().join("");const out = [];for (let i = 1; i <= n; i++) { const s = lines[i].trim(); const h = Math.floor(s.length / 2); // 앞쪽 h글자, 한가운데(길이가 홀수일 때만 한 글자), 뒤쪽 h글자 const front = s.slice(0, h); const middle = s.slice(h, s.length - h); const back = s.slice(s.length - h); out.push(reversed(front) + middle + reversed(back));}console.log(out.join("\n"));
TypeScriptmain.ts · 16 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);// 문자열에는 reverse가 없어서 글자 배열로 바꿔 뒤집고 다시 잇는다const reversed = (t: string): string => [...t].reverse().join("");const out: string[] = [];for (let i = 1; i <= n; i++) { const s: string = lines[i].trim(); const h: number = Math.floor(s.length / 2); // 앞쪽 h글자, 한가운데(길이가 홀수일 때만 한 글자), 뒤쪽 h글자 const front: string = s.slice(0, h); const middle: string = s.slice(h, s.length - h); const back: string = s.slice(s.length - h); out.push(reversed(front) + middle + reversed(back));}console.log(out.join("\n"));
JavaMain.java · 27 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { // String은 고칠 수 없어서 StringBuilder에 담아 뒤집는다 static String reversed(String t) { return new StringBuilder(t).reverse().toString(); } public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine().trim()); StringBuilder out = new StringBuilder(); for (int i = 0; i < n; i++) { String s = in.readLine().trim(); int len = s.length(); int h = len / 2; // substring(시작, 끝): 끝 자리는 들어가지 않는다 String front = s.substring(0, h); String middle = s.substring(h, len - h); String back = s.substring(len - h); out.append(reversed(front)).append(middle).append(reversed(back)).append('\n'); } System.out.print(out); }}
C#Main.cs · 22 行
using System;using System.Text;class Program{ static void Main() { int n = int.Parse(Console.ReadLine().Trim()); var sb = new StringBuilder(); for (int i = 0; i < n; i++) { // string은 고칠 수 없어서 char 배열로 바꿔 그 자리에서 뒤집는다 char[] a = Console.ReadLine().Trim().ToCharArray(); int h = a.Length / 2; // Array.Reverse(배열, 시작, 개수): 셋째 값은 끝 자리가 아니라 개수다 Array.Reverse(a, 0, h); Array.Reverse(a, a.Length - h, h); sb.Append(new string(a)).Append('\n'); } Console.Write(sb); }}
C++main.cpp · 17 行
#include <algorithm>#include <iostream>#include <string>int main() { int n; std::cin >> n; for (int i = 0; i < n; i++) { std::string s; std::cin >> s; auto h = s.size() / 2; // std::reverse(시작, 끝): 끝은 들어가지 않는다. 그 자리에서 뒤집는다 std::reverse(s.begin(), s.begin() + h); std::reverse(s.end() - h, s.end()); std::cout << s << '\n'; }}
Cmain.c · 28 行
#include <stdio.h>#include <string.h>/* s[from] ~ s[to]를 그 자리에서 뒤집는다. 양 끝에서 가운데로 오며 맞바꾼다 */static void reverse_range(char *s, int from, int to) { while (from < to) { char tmp = s[from]; s[from] = s[to]; s[to] = tmp; from++; to--; }}int main(void) { int n; static char s[1001]; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%1000s", s); int len = (int)strlen(s); int h = len / 2; reverse_range(s, 0, h - 1); /* 앞쪽 h글자 */ reverse_range(s, len - h, len - 1); /* 뒤쪽 h글자 */ printf("%s\n", s); } return 0;}
Craykonmain.cray · 11 行
n = コンソール.行読み().数に();繰り返す (i = 0; i < n; i++){ s = コンソール.行読み().空白除去(); h = 数学.商(s.長さ, 2); // 부분문자열(시작, 개수): 둘째 값은 끝 자리가 아니라 글자 수다 앞쪽 = s.切り出す(0, h); 가운데 = s.切り出す(h, s.長さ - 2 * h); 뒤쪽 = s.切り出す(s.長さ - h, h); コンソール.書く(앞쪽.逆に() + 가운데 + 뒤쪽.逆に());}