{ }codelper
リストの並べ替えP0253

看板の文字の片づけ

看板屋が単語の看板を外し、文字のかけらを箱に順に片づける。
一行目に単語の数 n が、続く n 行に単語が一つずつ与えられる。
単語は数字(0〜9)、英大文字、英小文字だけでできている。
単語ごとに、その文字を文字コード(ASCII)の小さいものから並べた文字列を一行に出力せよ。
そのため数字はすべて大文字より前に、大文字はすべて小文字より前に来る(b、A、9、a → 9Aab)。
同じ文字は出てきた数だけすべて書く。

入力
1 ≤ n ≤ 100、単語の長さ 1〜1,000。
単語には数字と英大文字・小文字だけがある
出力
n 行、各行に文字をコード順に並べた文字列
例 1 · stdin
3
banana
Codelper2026
ZzAa
stdout
aaabnn
0226Cdeelopr
AZaz
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

文字列を文字のリストに変えて並べ替え、また文字列につなぐ三つの手順です。
最後の手順に言語ごとの落とし穴があります。
Python sorted(w) は文字のリストを返すので、そのまま出すと ['a', 'b'] になります。
"".join(sorted(w)) でつなぎます。
Java は char[] a = w.toCharArray(); Arrays.sort(a); のあと new String(a) で変えます。
a.toString() は [C@1b6d3586 のような文字を、C# の a.ToString() は System.Char[] を返します(C# は Array.Sort(a) のあと new string(a))。
JS・TS は [...w].sort().join("") ですが、数の並べ替えで使う (a, b) => a - b をそのまま付けると文字どうしの引き算が NaN になり、何も動きません。
文字なら比較関数なしの sort() がコード順です。
C++ は std::sort(w.begin(), w.end()) で文字列をそのまま並べ替え、C は qsort(w, strlen(w), 1, cmp) で 1 バイトのマスを並べ替えます。
Craykon は それぞれ (c の中 w) で文字をリストに入れ、letters.並べ替え(); のあと letters.つなぐ("") でつなぎます。
順番は辞書順ではなくコード順なので、大文字 Z(90)が小文字 a(97)より前です。
大文字小文字を無視して並べ替えると(key=str.lower)ZzAa が AaZz になって間違いです。

Pythonmain.py · 5 行
n = int(input())for _ in range(n):    w = input().strip()    # sorted(문자열)은 글자 목록을 준다 → "".join으로 다시 문자열로    print("".join(sorted(w)))
JavaScriptmain.js · 3 行
const [n, ...words] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/);// 글자끼리는 비교 함수 없이 sort()가 글자 코드 순이다console.log(words.map((w) => [...w].sort().join("")).join("\n"));
TypeScriptmain.ts · 4 行
import { readFileSync } from "node:fs";const [n, ...words]: string[] = readFileSync(0, "utf8").trim().split(/\s+/);const sorted: string[] = words.map((w: string) => [...w].sort().join(""));console.log(sorted.join("\n"));
JavaMain.java · 18 行
import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Arrays; public class Main {    public static void main(String[] args) throws Exception {        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++) {            char[] a = in.readLine().trim().toCharArray();            Arrays.sort(a);            // char[]를 문자열로: new String(a) (a.toString()은 주소 같은 글자가 나온다)            out.append(new String(a)).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 18 行
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++)        {            char[] a = Console.ReadLine().Trim().ToCharArray();            Array.Sort(a);   // char는 코드 순으로 정렬된다            sb.Append(new string(a)).Append('\n');        }        Console.Write(sb);    }}
C++main.cpp · 16 行
#include <algorithm>#include <iostream>#include <string> int main() {    int n;    std::cin >> n;    std::string out;    for (int k = 0; k < n; k++) {        std::string w;        std::cin >> w;        std::sort(w.begin(), w.end());   // string은 char를 담은 목록처럼 바로 정렬된다        out += w + "\n";    }    std::cout << out;}
Cmain.c · 20 行
#include <stdio.h>#include <stdlib.h>#include <string.h> static int by_code(const void *pa, const void *pb) {    unsigned char a = *(const unsigned char *)pa, b = *(const unsigned char *)pb;    return (a > b) - (a < b);} int main(void) {    int n;    static char w[1024];    scanf("%d", &n);    for (int k = 0; k < n; k++) {        scanf("%1023s", w);        qsort(w, strlen(w), 1, by_code);   /* 글자 하나가 1바이트 */        puts(w);    }    return 0;}
Craykonmain.cray · 13 行
n = コンソール.行読み().数に();繰り返す (i = 0; i < n; i++){    w = コンソール.行読み().空白除去();    // 문자열을 글자 목록으로 옮겨 정렬하고 다시 잇는다    글자들 = [];    それぞれ (c の中 w)    {        글자들.追加(c);    }    글자들.並べ替え();    コンソール.書く(글자들.つなぐ(""));}