Algorithm/programmers/2018 KAKAO BLIND RECRUITMENT /level2/ 방금 그곡(with python)

yellow·2021년 6월 25일
0

알고리즘 문제

목록 보기
52/58

📖 문제

📝 풀이 과정

  1. 입력으로 주어진 m에 있는 음 중 '#'이 붙은 음들을 모두 소문자로 변환해준다.(함수 replace_pound()) <- 문자열 검사를 할 때 편리하기 위해서!
  2. 입력으로 주어진 musicinfos를 순회
    2-1. 문자열 검사가 편리하도록 음악 정보에 있는 '#'이 붙은 음들을 모두 소문자로 변환
    2-2. 해당 음악이 재생된 시간을 구한다.(함수 time_calc())
    2-2. 음악 길이보다 재생 길이가 길면 음악 반복해서 재생(해당 음악의 음계들을 concatenation해서 재생 길이 이상으로 만든다.)아니면, 그대로 둔다.
    2-3. 음악 길이를 재생 길이만큼 자른다.
    2-4. 2-3까지 해서 구한 재생된 음악 안에 m이 있는지 확인해서 있다면 정답 리스트에 넣는다. 이때 정답 리스트는 최소힙!

    정답 리스트에 넣을 때 [-play_time, cnt, title]로 넣는 이유

    • "조건이 일치하는 음악이 여러개일 때에는 라이도에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다." 조건을 만족시키기 위해서!
  3. 정답 리스트에 요소가 있다면 첫번째 요소

⌨ 코드

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() 메소드로 한 문자로 변환해서 처리하면 된다는 것을 알게 되었다.

profile
할 수 있어! :)

0개의 댓글