整列プログラム[3]ファイル名

3226 ワード

🙂 質問-ココ[1回目]シャトルバス


url : https://programmers.co.kr/learn/courses/30/lessons/17686?language=python3

勘定科目の問題の内容


3回のコードテストと2回の面接に合格し、長時間の点字公開に無事合格し、ココア社に入社した武智はファイルストレージサーバの管理を担当した.
リポジトリ・サーバには、プログラムのすべての過去のバージョンが含まれているため、名前順のファイル・リストは表示しにくい.ファイルを名前でソートするとver-10が作成されます.zipはver-9です.zipより先に表示されるからです.
バージョン番号を除いて、数値を含むファイルリストは多くの点で管理しにくい.例えば、ファイルリストが[「img 12.png」、「img 10.png」、「img 2.png」、「img 1.png」、「img 10.png」、「img 12.png」、「img 2.png」の場合、数字順の[「img 1.png」、「img 2.png」、「img 10.png」、「img 12.png」、「img 12.png」、「img 12.png」の場合、自然な順序で並べられたファイルリストはずっと多い.
無知は、単純な文字コード順ではなく、ファイル名に含まれる数字に基づいてソート機能をリポジトリ管理プログラムで実現することを決定します.
ソース・ファイル・リポジトリに格納されるファイル名は、英字大文字、数字、スペース(")、ピリオド(".")、マイナス記号("-")で構成されています.ファイル名はアルファベットで始まり、1つ以上の数字が含まれます.
ファイル名は、HEAD、NUMBER、TAILの3つの部分で構成されています.
  • HEADは、少なくとも1文字以上の非デジタル文字で構成されています.
  • NUMBERは、1文字から最大5文字までの連続数字で構成され、前は0であってもよい.0から999999までの数字は、00000や0101などであってもよい.
  • TAILは残りの部分で、数字が再表示される可能性があり、文字がない可能性があります.
  • ファイル名を3つのセクションに分けて、次の基準に従ってファイル名をソートします.
  • ファイル名は、まずHEAD部分に準じて辞書順に並べ替えられる.この場合、文字列の比較では大文字と小文字は区別されません.MUZIとMUZI,MUZIはソート時に同じ順序で処理する.
  • ファイル名のHEAD部分が大文字と小文字の違いを除いて同じである場合、NUMBERの数値順に並べ替えられます.9<10<0011<012<13<014の順に並べます.数値の前の0は無視され、012と12はソート時に同じ値に処理されます.
  • 両ファイルのHEAD部分とNUMBERの数字が同じであれば、元の入力の順序は維持されます.MUZI01.ZipとMuzi 1pngが入力として入力されると、ソート後も入力時に与えられた2つのファイルの順序を変更することはできません.
  • 無知なファイル名ソートプログラムの実装を支援します.

    👇 入力フォーマット


    入力として、整列ファイルを与えます.
  • filesは、1000個以下のファイル名を含む文字列配列である.
  • 各ファイル名の長さは、英字大文字小文字、数字、スペース(")、ピリオド(".")、マイナス記号("-")で構成されています.ファイル名はアルファベットで始まり、1つ以上の数字が含まれます.
  • には重複するファイル名はありませんが、大文字と小文字の違いや数値の最初のゼロの違いのファイル名を同時に与えることができます.(Muzi 1.txt、Muzi 1.txt、Muzi 001.txt、Muzi 1.TXTとともに入力できます.)
  • 👆出力フォーマット


    上記標準出力で並べ替えます.

    🖐解答方法

  • プログラマーでLEVEL 2を構成します.
  • 今回の問題解決の鍵はhead/number/tailで割ることです.
  • 📃 CODE

      def make_data(file,i):
       head =''
       number =''
       count = 0
       tail = ''
       for idx in range(len(file)):
           if count ==0 and (file[idx] <'0' or file[idx]>'9'):
               head+=file[idx]
           
           elif count <5 and (file[idx] >='0' and file[idx]<='9'):
               number +=file[idx]
               count+=1
           else:
               tail = file[idx:]
               break
    
       return (head,number,i,tail)
       
    
    def solution(files):
       answer = []
       change_data = []
       
       for idx in range(len(files)):
           change_data.append(make_data(files[idx],idx))
           
       sorted_data = sorted(change_data,
                            key = lambda x:(x[0].lower(),int(x[1]),x[2]))
       
       for i in sorted_data:
           answer.append(i[0]+i[1]+i[3])
       return answer

    11他の人の注釈の参考になる内容


    python libarayのreを使用して文字抽出を行い、より短く、より容易に解読できます.