알고리즘/카카오기출

[Python] programmers 방금 그곡

정찡이 2022. 2. 11. 15:17
728x90

1. 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

2. 문제 요약

  • 방금 그 곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.
  • 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
  • 각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.
  • 음악이 00:00을 넘겨서까지 재생되는 일은 없다.
  • 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
  • 조건이 일치하는 음악이 없을 때에는 “(None)”을 반환한다.

3. 아이디어 정리

  1. 곡 정보를 가공한다 - 음악이 흐른 시간만큼 곡을 만들어준다.
    • #이 들어간 데이터인 경우 소문자로 대체 - 1글자로 만들어서 파악하기 쉽게 하기 위해
  2. 매칭 되는 것이 있는지 찾기 ⇒ python 문자열 찾기 사용
  3. 결과 찾기 - 재생된 시간이 제일 긴 음악 제목 > 먼저 입력된 음악 제목 ⇒ 정렬

 

4. 문제 풀이

4-1. 내 풀이

def solution(m, musicinfos):
    """
    :param m: 네오가 기억한 멜로디
    :param musicinfos: 곡의 정보가 담긴 배열 - 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보
    :return: 조건과 일치하는 음악 제목 출력
    """
    def get_minute(str_):
        h, m_ = str_.split(':')
        return int(h) * 60 + int(m_)

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

    m = replace(m)
    answer = list()
    music = list()
    # 1. 곡 정보를 가공
    for mus in musicinfos:
        s, e, n, d = mus.split(',')  # 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보
        total = get_minute(e) - get_minute(s)   # 총 재생 시간
        d = replace(d)
        if total >= len(d):
            data = d * (total // len(d)) + d[:(total % len(d))]
        else:    # 작은 경우 자르기
            data = d[:total]
        music.append((n, data))  # 이름, 음악이 흘러간 데이터

    # 2. 매칭되는 것이 있는지 찾기
    for i, d in enumerate(music):
        name, mus = d
        if len(m) > len(mus):  # 찾는 곡이 더 긴 경우 그만
            continue
        if mus.find(m) != -1:
            answer.append((i, len(mus), name))

    # 3. 결과 찾기  - 재생된 시간이 제일 긴 음악 제목 > 먼저 입력된 음악 제목
    if answer:
        answer.sort(key=lambda x: (-x[1], x[0]))
        answer = answer[0][2]
    else:
        answer = '(None)'
    return answer

 

 

5. 결론

  • 구현 문제