Python/CoTe

[프로그래머스] [3차] 방금그곡 - 파이썬

joannekim0420 2024. 2. 6. 03:40
728x90

 

 

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

생각보다 쉬웠던 문제.

풀이 : 30분

 

 

 

 

※ 접근법

1. 우선 C#, D#, F#, G#, A# 을 하나의 문자로 보기 위해 사용하지 않는 문자열로 치환해준다, 

예시) dict_ = {"C#": "H", "D#": "I", "F#":"J", "G#":"K", "A#":"L"}

2. 제한 사항에 있는 조건들 확인. 
- 1) 재생된 시간 계산

- 2) 재생된 시간이 제일 긴 조건 확인

- 3) 음악 길이보다 재생된 시간 길 때는 재생된 시간만큼 음악 반복 재생

- 4) 음악 길이보다 재생된 시간 짧을 때 처음부터 재생 길이만큼 짜르기

- 5) 조건이 일치하는 음악이 없을 때, "(None)" 반환.  

 

 



 

파이썬 답

def solution(m, musicinfos):
    answer = []
    
    # 샵을 하나의 문자로 찾기 위한 치환
    dict_ = {"C#": "H", "D#": "I", "F#":"J", "G#":"K", "A#":"L"}
    
    # 문자 치환
    for key, value in dict_.items():
        m = m.replace(key,value)
    
    for i, musicinfo in enumerate(musicinfos):
        stime, etime, title, song = musicinfo.split(",")
        
        # 문자 치환
        for key, value in dict_.items():
            song = song.replace(key,value)
        
        # 재생 시간 계산
        hour, minute = int(etime[:2]) - int(stime[:2]), int(etime[3:]) - int(stime[3:])
        played_time = 60*hour + minute
        
        # 재생된 시간이 음악 길이보다 길 때
        if played_time > len(song):
            song *= (played_time // len(song)) + 1
            
        # 재생된 시간이 음악 길이보다 짧을 때
        elif played_time < len(song):
            song = song[:played_time]
        
        # 후보 저장할 때 조건 정렬 위한 재생 시간, 순서 정보 저장
        if m in song:
            answer.append((title, played_time, i))
    
    # 재생 시간 긴 순서대로 정렬 -x[1] , 노래 순서대로 정렬 x[2]
    return_cand = sorted(answer, key = lambda x: (-x[1], x[2]))
    
    # 빈 정렬이면 "(None)" return
    return return_cand[0][0] if return_cand != [] else "(None)"