본문 바로가기
알고리즘

[python]programmers-방금그곡

by ujin2021 2020. 11. 30.

2017 KAKAO BLIND RECRUITMENT

문제 : 방금그곡

 

  • 원래의 노래가사를 재생된 시간만큼 늘려야한다.
  • #이 붙은 것은 #을 제거해야한다.(C#을 1개로 봐야함)

내 코드

def removeS(s) :
    new_s = ''
    for i in range(len(s)-1) :
        if(s[i+1] == '#') :
            new_s += s[i].lower()
        elif(s[i] == '#') :
            continue
        else :
            new_s += s[i]
    if(s[-1] != '#') :
        new_s += s[-1]
    return new_s

def solution(m, musicinfos):
    title = []
    new_m = removeS(m)
    print('new m : ', new_m)
    for i in range(len(musicinfos)) :
        info = musicinfos[i].split(',')
        start = info[0]
        end = info[1]
        lylics = removeS(info[3])
        time = (int(end[0:2]) * 60 + int(end[3:])) - (int(start[0:2]) * 60 + int(start[3:]))
        long_lylics = lylics * (time // len(lylics)) + lylics[:(time % len(lylics))]
        
        if(new_m in long_lylics) :
            title.append([i, time, info[2]])
    if(len(title) == 0) :
        return '(None)'
    elif(len(title) == 1) :
        return title[0][2]
    else :
        title = sorted(title, key = lambda x: x[1], reverse=True)
        max_time = title[0][1]
        i = 0
        for i in range(len(title)) :
            if(title[i][1] == max_time) :
                pass
            else :
                title = title[:i]
                break
        if(len(title) == 1) :
            return title[0][2]
        title = sorted(title, key = lambda x : x[0])
        return title[0][2]

 

  • 먼저 입력되는 음(m)에서 #을 제거(removeS)하고, 소문자로 대체한다(C# -> c, D# -> d)
  • 재생된 곡의 정보들(musicinfos)에서 정보를 분리시킨다. 마찬가지로 원곡의 음도 #을 제거해준다.
  • 재생된 시간만큼 음을 늘려야 한다. 따라서 재생된 시간을 계산했다(1분에 하나의 음이 재생되므로 n분 으로 나타내었다. : 이전인 시간에 60을 곱하고, 나머지 : 뒤의 분을 더해준 뒤, 끝난시간에서 시작한 시간을 빼주었다.)
  • 재생된 시간만큼 음을 늘린다.
    • 만약 음이 abc개(len(lylics) = 3)이고, 9분(time = 9)동안 재생되었다면 time//len(lylics) == 3이므로 long_lylics는 abc*3이므로 abcabcabc가 된다.
    • 만약 음이 abc이고, 7분동안 재생되었다면 time // len(lylics) == 2이고, 나머지는 1이므로 abc * 2 + abc[:1]이므로 abcabca가 된다.
  • 만약 new_m(m에서 #제거한것)이 진짜 음에 있다면, 인덱스정보/재생시간/곡의제목 을 하나로 묶어 list에 append해준다(만약 해당하는 곡이 하나이면 곡의 제목만 출력하면 되지만, 여러개가 되면 재생시간이 긴것 을 뽑아야하고, 이거마저 겹치면 먼저 재생된 곡을 골라야한다)
  • 만약 해당하는 곡이 없으면(len(title) == 0) None return
  • 만약 해당하는 곡이 하나 있으면 바로 제목 return
  • 만약 여러개라면, 재생시간으로 정렬하고, 그안에서 먼저 재생된 곡(인덱스)을 정렬한다
    • 먼저 재생시간으로 정렬한다(reverse=True로 하여 재생시간이 긴것이 맨앞에 오도록 한다)
    • 정렬된 리스트 0번째의 재생시간이 가장 기므로 max_time에 값을 넣어준다
    • 재생시간이 같은 곡이 있는지 확인한다(같다면 pass, 만약 다르다면 그 앞의 인덱스 까지만 자른다)
    • 만약 재생시간이 가장 긴게 오직 하나라면 그곡의 제목을 return
    • 만약 여러개라면 index를 기준으로 정렬한다(이때는 index가 작은게 먼저 들어온것이므로 reverse 옵션을 넣어주지 않아도 된다)
    • 정렬된 것 중 0번째(index가 가장작은것, 그들 중 먼저 실행된 것)의 제목을 return한다