❓ 문제
2018 KAKAO BLIND RECRUITMENT - [3차] 방금그곡
🛎️ 아이디어
1. musicinfos 배열에서 가져온 데이터를 "," 기준으로 분리한다.
2. sheet(악보정보)를 list를 사용해 문자열을 분리하고 만약 분리된 문자열이 #이면 바로 앞 문자에 붙여준다.
a. "AB#C" -> ["A", "B", "#", "C"] -> ["A", "B#", "#", "C"]
3. sheet 배열에서 '#'를 삭제해준다.
a. ["A", "B#", "#", "C"] -> ["A", "B#", "C"]
4. 시작 시간과 종료 시간은 ":" 기준으로 시/분으로 분리한다.
5. 시와 분끼리 계산해주고 실제 재생된 Melody를 만들어준다.
6. 해당 멜로디에 네오가 기억하는 부분이 있는지 확인한다.
a. 샾이 붙은 데이터는 미리 제거한다.
ㄱ. ABC#D에는 ABC와 ABC# 모두 포함될 수 있다.
ㄴ. 네오가 기억하는 부분에 #를 더한 ABC#과 ABC##을 찾아서 미리 제거한다.
7. 네오가 기억하는 부분이 포함되면 match_list에 append해준다.
8. 재생시간 기준으로 역순 정렬한다. 만약 match_list가 비어있다면 (None)을 반환한다.
💻 풀이
# 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보
def solution(m, musicinfos):
match_list = []
for musicinfo in musicinfos:
start_time, end_time, title, sheet = musicinfo.split(",")
# sheet 변경
#1. 모든 문자열 분리 및 #붙이기
sheet = list(sheet)
for idx, item in enumerate(sheet):
if item == "#":
sheet[idx - 1] += "#"
# 샾 제거
sheet = [i for i in sheet if i != "#"]
# 분, 초 분리
start_hour, start_minute = start_time.split(":")
end_hour, end_minute = end_time.split(":")
# 재생 시간 계산
sub_hour = int(end_hour) - int(start_hour)
sub_minute = int(end_minute) - int(start_minute)
play_time = 60 * sub_hour + sub_minute
melody = sheet * (play_time // len(sheet)) + sheet[:play_time % len(sheet)]
# 샾이 붙은 데이터 제거
# ABC#D에는 ABC와 ABC# 모두 포함될 수 있음. 따라서 ABC#과 ABC##을 찾아서 미리 없앰.
check_melody = ''.join(melody).replace(m + "#", '')
if m in check_melody:
match_list.append({"playTime": play_time,
"title": title})
match_list = sorted(match_list, key= lambda x: x["playTime"], reverse= True)
if match_list == []:
return "(None)"
else:
return match_list[0]["title"]
'Algorithm | Language > Python' 카테고리의 다른 글
[programmers/Lv.2] 행렬 테두리 회전하기 (0) | 2023.02.23 |
---|---|
[programmers/Lv.2] 후보키 (0) | 2023.02.23 |
[programmers/Lv.2] 스킬트리 (0) | 2023.02.23 |
[Python] 1 to 50 게임 매크로 (0) | 2020.06.02 |
[Python] 네이버 웹툰 크롤링 (0) | 2020.05.29 |