❓  문제

2018 KAKAO BLIND RECRUITMENT - [3차] 방금그곡

 

🛎️  아이디어

1. musicinfos 배열에서 가져온 데이터를 "," 기준으로 분리한다.

2. sheet(악보정보)를 list를 사용해 문자열을 분리하고 만약 분리된 문자열이 #이면 바로 앞 문자에 붙여준다.
      a. "AB#C" -> ["A", "B", "#", "C"] -> ["A", "B#", "#", "C"]

3. sheet 배열에서 '#'를 삭제해준다.
      a. ["A", "B#", "#", "C"] -> ["A", "B#", "C"]

4. 시작 시간과 종료 시간은 ":" 기준으로 시/분으로 분리한다.

5. 시와 분끼리 계산해주고 실제 재생된 Melody를 만들어준다.

6. 해당 멜로디에 네오가 기억하는 부분이 있는지 확인한다.
      a. 샾이 붙은 데이터는 미리 제거한다.
            ㄱ. ABC#D에는 ABC와 ABC# 모두 포함될 수 있다.
            ㄴ. 네오가 기억하는 부분에 #를 더한 ABC#과 ABC##을 찾아서 미리 제거한다.

7. 네오가 기억하는 부분이 포함되면 match_list에 append해준다.

8. 재생시간 기준으로 역순 정렬한다. 만약 match_list가 비어있다면 (None)을 반환한다.

 

💻  풀이

# 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보
def solution(m, musicinfos):
    match_list = []

    for musicinfo in musicinfos:
        start_time, end_time, title, sheet = musicinfo.split(",")

        # sheet 변경
        #1. 모든 문자열 분리 및 #붙이기
        sheet = list(sheet)
        for idx, item in enumerate(sheet):
            if item == "#":
                sheet[idx - 1] += "#"

        # 샾 제거
        sheet = [i for i in sheet if i != "#"]

        # 분, 초 분리
        start_hour, start_minute = start_time.split(":")
        end_hour, end_minute = end_time.split(":")

        # 재생 시간 계산
        sub_hour = int(end_hour) - int(start_hour)
        sub_minute = int(end_minute) - int(start_minute)
        play_time = 60 * sub_hour + sub_minute

        melody = sheet * (play_time // len(sheet)) + sheet[:play_time % len(sheet)]

        # 샾이 붙은 데이터 제거
        # ABC#D에는 ABC와 ABC# 모두 포함될 수 있음. 따라서 ABC#과 ABC##을 찾아서 미리 없앰.
        check_melody = ''.join(melody).replace(m + "#", '')
        if m in check_melody:
            match_list.append({"playTime": play_time,
                               "title": title})

    match_list = sorted(match_list, key= lambda x: x["playTime"], reverse= True)
    if match_list == []:
        return "(None)"
    else:
        return match_list[0]["title"]

+ Recent posts