나의 개발일지

[프로그래머스] Lv.2 [3차] 방금그곡 [Python, 파이썬] KAKAO 본문

프로그래머스

[프로그래머스] Lv.2 [3차] 방금그곡 [Python, 파이썬] KAKAO

YoonJuHan 2023. 10. 8. 21:26
  • 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/17683
  • 🔑 #붙은 음들을 다른 문자로 변환해서 비교를 했다.
    • ex) "C#" = "c"
    • 재생 시간보다 긴 악보일 때는 재생 시간만큼만 악보를 잘랐다.
    • 재생 시간보다 짧은 악보일 때는 재생 시간 이상이 될 때까지 악보를 연결했다.
    • 일치하는 악보가 여러 개 일 경우 재생 시간이 가장 긴 음악을 반환해야 하기 때문에 재생 시간을 음수로 넣고 정렬을 했다.
      • 10분이면 -10
      • 20분이면 -20
      • 정렬하면 오름차순이 되기 때문에 -20, -10으로 정렬이 된다.
    • 재생 시간도 같은 경우 먼저 입력된 음악을 반환, 이 과정도 위처럼 정렬을 하면 자동으로 성립된다.

 

def convert(s): # C# -> c 처럼 변환
    sharp = ["C#", "D#", "F#", "G#", "A#"]
    
    for i in sharp:
        s = s.replace(i, i[0].lower())
    return s

def solution(m, musicinfos):
    answer = []
       
    m = convert(m)
    
    for i in musicinfos:
        music = i.split(',')
        st = music[0].split(':')
        ed = music[1].split(':')
        st = int(st[0]) * 60 + int(st[1])
        ed = int(ed[0]) * 60 + int(ed[1])
        time = ed - st          # 재생 시간
        cm = convert(music[3])  # 변환한 악보
        
        if time < len(cm):              # 재생 시간보다 긴 악보면
            cm = cm[:time]              # 재생 시간만큼만 잘라준다.
        else:                           # 재생 시간보다 짧은 악보면
            while time >= len(cm):      # 재생 시간보다 길이가 길게 만들어준다.
                cm += cm
            
        if m in cm:
            answer.append([-time, music[2]])    # 재생 시간은 음수로 (정렬하기 위함)

    if not answer:          # 일치하는 음악이 없을 때
        return "(None)"
    else:                   # 일치하는 음악 여러 개 일 때
        answer.sort(key = lambda x : x[0])  # 재생 시간으로 정렬
        return answer[0][1]
Comments