- 문제 링크: programmers.co.kr/learn/courses/30/lessons/17683

 

스킬 체크 테스트 Lv2 문제입니다. 2018 카카오 블라인드 채용 코딩테스트 문제였다고도 하는군요

들었던 노래의 음 시퀀스가 나오고 (ex. "A#BC#B"), 라디오에서 틀었던 음악의 목록을 보기로 주어줍니다.

이때 라디오에서 한 노래를 반복해서 틀 수 있다는 점을 염두하고, 해당되는 곡이 많으면 길이가 가장 길고 가장 앞선것, 없다면 (None)을 반환하면 되는 문제입니다

 

def solution(m, musicinfos):
    note_map = {
        "C#": "H",
        "D#": "I",
        "F#": "J",
        "G#": "K",
        "A#": "L",
    }
    for _from, _to in note_map.items():
        m = m.replace(_from, _to)

    max_played, answer = 0, "(None)"
    for music_info in musicinfos:
        start, end, name, notes = music_info.split(",")
        for _from, _to in note_map.items():
            notes = notes.replace(_from, _to)

        music_len = len(notes)

        start_hour, start_min = start.split(":")
        end_hour, end_min = end.split(":")
        played_min = (int(end_hour) - int(start_hour)) * 60 + int(end_min) - int(start_min)

        really_played_notes = notes * (played_min // music_len)

        diff = played_min % music_len
        really_played_notes += notes[:diff]

        if m in really_played_notes and played_min > max_played:
            max_played = played_min
            answer = name

    return answer

일단 # 처리를 좀 해줘야 합니다. 파이썬이니까 간단히 replace를 해줍니다. 다른 노트와 겹치지 않게 대충 캐릭터를 할당해주시면 됩니다

그럼 매우 편리해집니다. 나머지는 뭐 쉬우니.. 코드로 확인해주세요

반응형