{ }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()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

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

다른 언어로는?언어별 풀이 보기 · 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바이트짜리 칸을 정렬해요.
크레이콘은 각각 (c 에서 w)로 글자를 목록에 넣고 글자들.정렬(); 뒤 글자들.잇기("")로 이어요.
순서는 사전 순이 아니라 코드 순이라 대문자 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);    }    글자들.정렬();    콘솔.쓰기(글자들.잇기(""));}