본문 바로가기

개발/algorithm

[프로그래머스][level2] 방금그곡 - python

문제 링크

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

 

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

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

programmers.co.kr

풀이 

- get_time : 재생된 시간 구하는 함수

- get_s : 음을 구분한 배열 구하는 함수 

 

1. 음악 별로 시작 시간, 끝난 시간, 음악 제목, 악보 정보를 ','를 기준으로 잘라서 각 변수에 대입

2. 재생 시간 구하기 & 음을 구분한 배열을 구하고, 악보의 길이 구하기

3. 총 재생된 악보 구하기 

4. 총 재생된 악보에서 m이 존재하는지 확인하고, 재생시간이 answer보다 길면 제목 갱신 

def get_time(x, y):
    x = int(x[:2]) * 60 + int(x[3:])
    y = int(y[:2]) * 60 + int(y[3:])
    
    return y-x

# 악보의 음을 구분한 배열 구하는 함수 
def get_s(s):
    
    result = []
    for i in range(len(s)):
        if s[i] == '#':
            continue 
        
        # 마지막 음이 '#'이 아니면 삽입 
        if i == len(s)-1 :
            result.append(s[i])
        else :
        	# '#'와 함께 구성된 음이면 
            if s[i+1] == '#':
                result.append(s[i:i+2])
            else:
                result.append(s[i])
    return result
        
def solution(m, musicinfos):
	# 정답 제목과 재생 시간 
    answer = ''
    t_answer = 0
    
    for music in musicinfos :
    	# ','을 기준으로 나누어서 각 변수에 대입 
        start, end, name, info = map(str,music.split(','))
        # 재생 시간 구하기 
        t = get_time(start,end)
        
        # 음 구분한 배열 구하기 
        result = get_s(info)
        # 악보의 총 길이 
        l = len(result)
        
        # 재생된 악보 저장할 배열 
        s = []
       	# 재생 기간에 악보 전체가 재생될 수 있는 수만큼 전체 악보 삽입 
        for _ in range(t//l):   
            s.extend(result)
        
        # 나머지 악보 삽입 
        for i in range(t%l):
            s.append(result[i])
          
        # 기억한 멜로디의 재생 길이 구하기 
        m_l = len(get_s(m))
        
        # 재생된 총 악보에 기억한 멜로디가 존재하는지 확인 
        for i in range(len(s)- m_l+1):
            if m == "".join(s[i:i+m_l]):
            	# 총 재생기간이 긴 것으로 갱신 
                if t_answer < t:
                    answer= name
                    t_answer = t 
      
   	# 일치하는 것이 없다면 
    if len(answer) == 0 :
        return '(None)'     
        
    return answer