파일명 정렬 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""파일명 정렬 (프로그래머스 17686) 풀이와 검증."""
import random
import re
from functools import cmp_to_key


def solution(files):
    def key(f):
        head, number = re.match(r"(\D+)(\d{1,5})", f).groups()
        return (head.lower(), int(number))
    return sorted(files, key=key)


def by_compare(files):
    def split(f):
        i = 0
        while not f[i].isdigit():
            i += 1
        j = i
        while j < len(f) and f[j].isdigit() and j - i < 5:
            j += 1
        return f[:i].lower(), int(f[i:j])

    items = [(split(f), idx, f) for idx, f in enumerate(files)]

    def cmp(a, b):
        (ha, na), ia, _ = a
        (hb, nb), ib, _ = b
        if ha != hb:
            return -1 if ha < hb else 1
        if na != nb:
            return -1 if na < nb else 1
        return -1 if ia < ib else (1 if ia > ib else 0)

    return [f for _, _, f in sorted(items, key=cmp_to_key(cmp))]


def rand_name(rng):
    head = rng.choice("abAB") + "".join(rng.choice("abAB .-") for _ in range(rng.randint(0, 3)))
    num = "".join(rng.choice("0123456789") for _ in range(rng.randint(1, 7)))
    tail = "".join(rng.choice("ab.-0123 ") for _ in range(rng.randint(0, 4)))
    return head + num + tail


if __name__ == "__main__":
    assert solution(["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]) == \
        ["img1.png", "IMG01.GIF", "img02.png", "img2.JPG", "img10.png", "img12.png"]
    assert solution(["F-5 Freedom Fighter", "B-50 Superfortress", "A-10 Thunderbolt II", "F-14 Tomcat"]) == \
        ["A-10 Thunderbolt II", "B-50 Superfortress", "F-5 Freedom Fighter", "F-14 Tomcat"]
    assert solution(["b2.txt", "A10.txt", "a2.png", "a02.txt"]) == ["a2.png", "a02.txt", "A10.txt", "b2.txt"]
    assert re.match(r"(\D+)(\d{1,5})", "img123456.png").groups() == ("img", "12345")
    rng = random.Random(17686)
    for _ in range(2000):
        files = list({rand_name(rng) for _ in range(rng.randint(1, 12))})
        rng.shuffle(files)
        assert solution(files) == by_compare(files), files
    print("ALL CHECKS PASSED")