[プログラマー]さっきの歌


https://programmers.co.kr/learn/courses/30/lessons/17683
使用するアルゴリズム/データ構造
問題で提起された条件はコードで表現される問題である.
#これらの付加コードと未付加コード(C#VS C)を区別するために、
C# -> *C#
同じ形式に変更します.
メロディーを含む資料を(idx,minutes)形式で格納した.
それを問題提起の条件に合わせて組み合わせて正解を見つけた.
コード#コード#
def solution(m, musicinfos):
    my = ""
    for i in range(len(m)):
        if i+1 < len(m) and m[i+1] == '#':
            my += "*"
        my += m[i]
        
    names, candidates = [], []
    for i in range(len(musicinfos)):
        info = musicinfos[i]
        tmp = info.split(',')
        names.append(tmp[2])

        h1, m1 = map(int, tmp[0].split(":"))
        h2, m2 = map(int, tmp[1].split(":"))
        minutes = (h2 - h1) * 60 + m2 - m1

        melodies = to_array(tmp[3])
        full_melodies = ''.join(melodies * (minutes//len(melodies)) + melodies[:minutes%len(melodies)])
        if my in full_melodies:
            candidates.append((i, minutes))
    if candidates:
        candidates.sort(key=lambda x : -x[1])
        return names[candidates[0][0]]
    else:
        return "(None)"

def to_array(m):
    arr = []
    for i in range(len(m)):
        if m[i] == '#':
            continue
        elif i < len(m)-1 and m[i+1] == '#':
            arr.append("*" + m[i:i+2])
        else:
            arr.append(m[i])
    return arr
コード改善方向
C#の2文字コードを1文字として認識するには、arrayに分割し、個数に応じてコピーして文字列に再接続する必要があります.
そうするよりも、#に添付されたコードを1文字の何かに変換すると、コードが簡潔になります.
コードは大文字でしか与えられないので、#に貼り付けられたコードを小文字に変換できます.
C# -> c, D# -> d, F# -> f, G# -> g, A# -> a
また、特定の値を1つだけ要求すればよいので、候補者にすべての資料を入れてソートするよりも、その時点で最適な年かどうかを確認したほうがいいです.
改良されたコード
def solution(m, musicinfos):
    m = transform(m)
    answer = (0, '(None)')
            
    for info in musicinfos:
        tmp = info.split(',')
        name = tmp[2]

        h1, m1 = map(int, tmp[0].split(":"))
        h2, m2 = map(int, tmp[1].split(":"))
        minutes = (h2 - h1)*60 + m2 - m1

        melodies = transform(tmp[3])
        full_melodies = melodies * (minutes // len(melodies)) + melodies[:minutes % len(melodies)]
        if m in full_melodies and minutes > answer[0]:
            answer = (minutes, name)

    return answer[1]

def transform(m):
    return m.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f').replace('G#', 'g').replace('A#', 'a')