티스토리 뷰

프로그래머스 '[3차] 방금 그 곡' 문제 풀이입니다.

 

문제 링크

 

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

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

programmers.co.kr

● 문제 간단 설명

멜로디에 해당하는 문자열 'm'과 음악이 플레이된 시간과 멜로디를 담고 있는 플레이리스트 배열 'musicInfos' 두 가지가 주어진다.

플레이리스트 중에서 멜로디를 오래 재생한 곡의 이름을 return 하는 문제이다.

 

● 문제 해결 방향

멜로디 문자열과 플레이리스트 배열 내 각각의 재생된 멜로디 문자열을 문자마다 1대 1로 비교가 필요하다고 생각했다.

그래서 멜로디 중 'C#', 'D#'과 같은 #을 가지고 있는 멜로디는 c, d와 같이 소문자로 치환해주는 작업을 먼저 해주었다.

 

다음으로,

플레이 리스트 내의 각 플레이에 대해서 ','로 우선 split 하여 시작시간(startTime), 끝난 시간(EndTime), 노래 이름(name), 멜로디(song)로 구분하였다.

시작시간, 끝시간을 통해 총 플레이 시간을 계산하고,

플레이 시간에 따른 실제 플레이된 풀 멜로디를 만들어,

우리가 찾고자하는 멜로디 m이 풀 멜로디 내에 포함되는지 체크해 주었다.

 

● 문제 해결 코드

def convertLowerCase(inputString):
    while '#' in inputString:
      sharpIndex = inputString.find('#');
      inputString = inputString.replace(
      	inputString[sharpIndex - 1:sharpIndex + 1],
        inputString[sharpIndex - 1].lower()
      )
    
    return inputString

def solution(m, musicinfos):
    answer = ''
    select_time = 0
    
    m = convertLowerCase(m)
    
    for music in musicinfos:

        music = convertLowerCase(music)
        
        startTime, endTime, name, song = music.split(',')

        startHour, startMinute = map(int, startTime.split(':'))
        endHour, endMinute = map(int, endTime.split(':'))

        time = (endHour - startHour) * 60 + endMinute - startMinute
        
        running_music = song*(time//len(song)) + song[:time % len(song)]
        
        if (select_time < time and m in running_music):    
            select_time = time
            answer = name

    return answer if answer != '' else '(None)'

convertLowerCase()

convertLowerCase는 멜로디 문자열의 '#'을 없애고 '#'을 포함하고 잇는 멜로디 'C#', 'D#'과 같은 멜로디를 'c', 'd'로 치환하는 함수이다. 멜로디 문자열 내에 #이 없을 때까지 치환을 반복한다.

 

solution()

우선 문자열을 비교할 수 있게 치환 함수를 적용한다.

 

다음 플레이 리스트 요소에 대해서 아래 작업을 반복한다.

  • 재생 데이터(music)에 대해 치환 함수를 적용한다.
  • 재생 데이터를 split하여 시작시간(startTime), 끝난 시간(EndTime), 노래 이름(name), 멜로디(song)로 구분한다.
  • 시작 시간과 끝난시간을 통해 플레이 타임을 계산한다.
  • 플레이 타임과 멜로디를 통해, 실제 재생된 전체 멜로디를 만들어낸다.
  • 전체 멜로디에 주어진 멜로디(m)가 포함되는지 확인한다.
    • 이때, 멜로디의 길이가 같다면, 빨리 입력된 음악이 return 되어야 한다.
    • 멜로디가 여러 음악에 포함된다면, 플레이 시간이 긴 음악이 return 되어야 하기 때문에,
      음악에 멜로디가 포함될 때마다 플레이 시간을 비교하여 적절한 값을 return 한다.
  • 해당하는 음악이 없을 경우 '(None)'을 return 하고, 적절한 음악이 있을 경우 그 음악의 이름을 return 해준다.

 

'C#', 'D#'과 같은 예외 음정을 잘 처리하고,

조건에 해당하는 음악이 많은 경우에 대한 예외처리를 잘해주는 것이 관건이었다고 생각한다.

 

초반에 예외 음정 처리 부분에서 pop이나 replace를 반복문을 사용하다 보니 런타임 에러가 발생해 많이 헤맸던 것 같고,

convertLowerCase()를 통해 런타임 에러를 해결했지만, 예외처리를 제대로 해주지 않아서 실패가 많이 발생했다.

 

 

● 참고

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함