🤔 문제


 

https://programmers.co.kr/learn/courses/30/lessons/17683?language=python3 

 

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

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

programmers.co.kr

😀 풀이


방금그곡 문제는 문제 조건에 따라 충실히 구현하면 되는 문제입니다. 각 음악 정보에 대해서 시간 길이만큼 음을 반복하여 배열에 넣어주고 이 배열이 네오가 들은 음들을 포함하고 있는지 체크하면 되는 문제입니다. 문제 해결을 위해 필요한 과정들을 함수들로 빼서 구현했는데 음을 배열로 교체하고 이 배열이 네오가 들은 음인지 체크하는 함수는 아래와 같습니다.

1. 음악을 배열로 바꾸는 과정 ( getMusicArr ) => ex) "C#CBBA" => ['C#', 'C', 'B', 'B', 'A']
2. 네오가 들은 음악 배열이 라디오에서 나온 음악 배열과 같은지 체크하는 함수 ( checkSubArray )
    ex) checkSubArray( [1, 2, 3], [3, 2, 1, 2, 3] ) => True

 

문제를 푸는 과정에서 주의할 점은 C#과 같이 #이 들어가는 음정은 하나의 음정으로 처리를 해주어야 합니다. 이 부분은 구현 코드 내의 함수인 getMusicArr에서 체크하여 처리했습니다.

 

또한,, 

조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.

 

위와 같은 조건으로 인해 중복으로 정답이 나올 경우 처리를 해주어야 하는데 이러한 체크를 38 ~ 40 라인에서 처리해주었으니 풀이 코드를 보실때 참고해주시면 좋을 것 같습니다.

 

💻 풀이 코드는 아래와 같습니다.

def getTime(start, end):
    sh, sm = map(int, start.split(':'))
    eh, em = map(int, end.split(':'))
    time = (eh - sh) * 60 + (em - sm)
    return time

def getMusicArr(musicString, time):
    result = []
    for c in musicString:
        if c == '#':
            result[-1] += '#'
        else:
            result.append(c)
    if time == 0: 
        return result
    if len(result) >= time:
        return result[:time]
    result = result * (time // len(result)) + result[:time % len(result)]
    return result    

def checkSubArray(sub, arr):
    length = len(sub)
    print(sub, arr)
    for i in range(len(arr)):
        if sub == arr[i:i + length]:
            return True
    return False            

def solution(m, musicinfos):
    answer = "(None)"
    answerTime = 0
    for info in musicinfos:
        start, end, name, music = info.split(',')
        time = getTime(start, end)
        musicArr = getMusicArr(music, time)
        m = getMusicArr(m, 0)
        if checkSubArray(m, musicArr):
            if answerTime < time:
                answer = name
                answerTime = time
    return answer
반응형
복사했습니다!