티스토리 뷰

문제 설명

 

처음 생각한 풀이

1. musicinfos에서 시간을 추출해서 몇 분 동안 연주됐는지 계산한다.

2. 계산한 시간만큼 악보를 늘려준다.

3. m이 musicinfos에 포함되는지 확인한다.

4. 기타 다른 조건들을 만족 시킨다. (라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다)

 

결과

이런식으로 간단하게 생각하고 풀었는데 계속 테스트 케이스 3이 통과가 되지 않았습니다..

알고 보니 m과 musicinfo의 악보를 비교할 때, C#인데 C라고 생각하고 풀고 있었어서 안됬던 거였습니다.

즉, #을 전혀 고려하지 않았습니다...........(규칙을 꼭 꼼꼼하게 보자)

 

 

다시 생각한 풀이

1. m을 입력받았을 때, 문자열의 뒷 인덱스 값이 '#'이면 합쳐서 새로운 리스트에 추가한다.

2. musicinfos에서 시간을 추출해서 몇 분 동안 연주됐는지 계산한다.

3. 계산한 시간만큼 악보를 늘려준다. (늘려 줄 때도 '#'을 고려해줌)

4. m_list를 늘려준 악보와 비교를 한다.

5. 기타 다른 조건들을 만족시킨다.

 

코드

def solution(m, musicinfos):
    answers = []         # 정답 배열
    m_list = []          # '#'을 고려해서 새로 만든 멜로디 리스트
    new_music_infos = [] # 사용하기 쉽게 만든 musicinfos 리스트
    
    # m_list 만들기
    for i in range(len(m) - 1):
            if m[i+1] == '#':
                m_list.append(m[i] + '#')
            elif m[i] == '#':
                if i+1 == len(m) - 1:
                    m_list.append(m[i+1])
                else:
                    continue
            elif m[i+1] != '#' and i+1 == len(m) - 1:
                m_list.append(m[i])
                m_list.append(m[i+1])
            else:
                m_list.append(m[i])
    
    # 시간 계산하기
    for n in range(len(musicinfos)):
        musicinfo = musicinfos[n].split(',')
        music_sheet = []
        total_music = []
        
        hour1, hour2 = musicinfo[0][0:2], musicinfo[1][0:2]
        min1, min2 = musicinfo[0][3:], musicinfo[1][3:]
        play_hour, play_minute = int(hour2) - int(hour1), int(min2) - int(min1)

        if play_minute < 0:
            play_hour -= 1
            play_minute += 60
        for h in range(play_hour):
            play_minute += 60
        
        # 재생되었던 악보 계산하기
        for i in range(len(musicinfo[3]) - 1):
            if musicinfo[3][i+1] == '#':
                music_sheet.append(musicinfo[3][i] + '#')
            elif musicinfo[3][i] == '#':
                if i+1 == len(musicinfo[3]) - 1:
                    music_sheet.append(musicinfo[3][i+1])
                else:
                    continue
            elif musicinfo[3][i+1] != '#' and i+1 == len(musicinfo[3]) - 1:
                music_sheet.append(musicinfo[3][i])
                music_sheet.append(musicinfo[3][i+1])
            else:
                music_sheet.append(musicinfo[3][i])
        
        repeat_count = play_minute // len(music_sheet)
        repeat_remain = play_minute % len(music_sheet)
        
        for i in range(repeat_count):
            total_music += music_sheet
            
        for i in range(repeat_remain):
            total_music.append(music_sheet[i])
        
        # 사용하기 좋게 [음악 이름, 총 악보, 재생 시간, 들어온 순서] 를 담는다.
        new_music_infos.append([musicinfo[2], total_music, play_minute, n])
            
    # 총 악보와 기억한 멜로디를 비교
    for i in range(len(new_music_infos)):
        tmp_list = []
        index = 0
        for j in range(len(new_music_infos[i][1])):
            if index >= len(m_list):
                break
            if m_list[index] == new_music_infos[i][1][j]:
                tmp_list.append(m_list[index])
                index += 1
            else:
                tmp_list.clear()
                index = 0
                if m_list[index] == new_music_infos[i][1][j]:
                    tmp_list.append(m_list[index])
                    index += 1
        
        # 조건이 일치하는 음악이 여러 개일 때를 대비해서 여러 조건 추가
        if m_list == tmp_list:
            answers.append([new_music_infos[i][0], new_music_infos[i][2], new_music_infos[i][3]]) 

    if len(answers) == 0:
        return "(None)"
    else:
        answers.sort(key=lambda x: (-x[1], x[2]))
        return answers[0][0]

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함