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한다
'알고리즘' 카테고리의 다른 글
[python] dijkstra 알고리즘 (0) | 2021.03.22 |
---|---|
[python]programmers-소수찾기 (0) | 2021.02.26 |
[python]programmers-뉴스클러스터링(자카드 유사도) (0) | 2020.11.30 |
[python]programmers-캐시 (0) | 2020.11.30 |
[python] 소수찾기 - 에라토스테네스의 체 (0) | 2020.09.11 |