アルゴリズム/プログラマー/2018 KAKAO BLIND RECRUIMENT/level 2/さっきの歌(Python付き)


📖 質問する



📝 解法

  • で入力し、与えられたm'#'の音をすべて小文字に変換する.(関数replace_pound())<-文字列チェックを容易にするため!
  • 入力、与えられたmusicinfosを巡回する
    2-1. 音楽情報の'#'音をすべて小文字に変換し、文字列チェックを容易にします.
    2-2. その音楽を再生する時間を求める.(関数time_calc())
    2-2. 再生長が音楽長より大きい場合は、音楽を繰り返し再生します(対応する音楽の音階を接続し、再生長を超えます).あるいは、そのまま置いておきます.
    2-3. 音楽の長さは再生の長さと同じです.
    2-4. 2−3までに求めた再生音楽のうちmがあることを確認すれば正解リストに入る.この時の正解は最小ヒップホップです!
    なぜ正解リストを記入するときに[-play_time, cnt, title]を選択したのか
  • 「複数の条件が一致する音楽があれば、レドの再生時間が最も長い音楽タイトルを返します.再生時間が同じであれば、まず入力した音楽タイトルを返します.」条件を満たすために!
  • の回答リストに要素がある場合、最初の要素
  • パスワード

    import heapq
    # 음악이 재생된 시간을 계산해주는 함수
    def time_calc(start, end):
        hour = int(end[:2]) - int(start[:2])
        if hour != 0:
            return 60*hour + int(end[3:]) - int(start[3:])
        else:
            return int(end[3:]) - int(start[3:])
    
    # '#'이 붙은 알파벳을 소문자로 변환해주는 함수
    def replace_pound(note):
        while '#' in note:
            i = note.find('#')
            if note[i] == '#':
                note = note.replace(note[i-1:i+1], note[i-1].lower())
        return note
    
    def solution(m, musicinfos):
        answer = []
        m = replace_pound(m)
    
        cnt = 0 # 음악이 입력된 순서를 알 수 있는 변수
        for musicinfo in musicinfos:
            musicinfo = musicinfo.split(',')
            start, end = musicinfo[0], musicinfo[1]
            title = musicinfo[2]
            note = musicinfo[3]
    
            note = replace_pound(note)
    
            play_time = time_calc(start, end)
            # 2-2. 음악 길이보다 재생 길이가 길면 음악을 반복해서 재생
            if len(note) < play_time:
                note *= (play_time // len(note) + 1)
            # 2-3. 음악 길이를 재생 길이만큼 자른다.
            note = note[:play_time]
    
            # 2-4. 재생된 음악 안에 m이 있다면 정답 리스트에 넣는다.
            if m in note:
                heapq.heappush(answer,[-play_time, cnt, title])
                cnt += 1
        if answer:
            return heapq.heappop(answer)[2]
        else:
            return '(None)'

    😊 に感銘を与える


    C#、D#などの「#」の音階をどう処理すればいいか分からなかった.
    しかし、このように一度に処理する文字をreplace()の方法に変換すればよい