honey_pot

[python] 방금 그곡 본문

문제 풀이

[python] 방금 그곡

_tera_ 2022. 8. 5. 00:58

https://school.programmers.co.kr/learn/courses/30/lessons/17683


#이 붙은 음들을 어떻게 가려낼 것인가가 정말 떠오르지 않았던 문제다 

처음엔 단순히 m in music 이런식으로 풀었는데 기본 테케는 통과하지만 제출 시 테케는 박살났다.

포인터로 하나하나 가리켜보나 이런 생각도 했지만 반나절 고민하고 힌트 구글링

 

그리고 

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

이 조건을 지킨다고 sort() 의 키에 첫번째로 재생된 시간, 두 번째로 실행된 노래 순서 인덱스를 주고 reverse=True 옵션을 안 줘서 한번 틀리고

reverse=True 옵션 주고 key lambda x : (1번,2번),reverse=True 이면 1번은 reverse=True로 2번은 reverse=False 로 풀어야 한다는 걸 캐치 못해서 또 틀리고

key lambda x : (1번,-2번),reverse=True 로 통과하고 나서야

내가 이미 2번째 조건에 해당하는 인덱스를 for 문에서 asc로 저장해서 굳이 key로 주지 않아도 됐다는 걸 깨달음 

이 문제는 고개 절레절레 하는 대머리 아재 라인 임티 붙여야 함 문제 읽다가 고개를 흔들게 됨

 

 

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
def replace(notes): # 뒤에 #이 붙는 음들을 모두 문제에서 입력되는 음정 데이터와 겹치지 않는 알파벳으로 치환하는 함수
    for a,b in zip(["A#""C#""D#""F#""G#"], ["Z","Y","X","W","U"]): # zip 함수로 묶어 ("A#","Z")... 형태가 되도록 한다.
        notes = notes.replace(a,b)
    return notes
 
def solution(m, musicinfos):
    music = [] # 필요한 데이터 가공해서 저장할 변수
    titles = [] # 들어온 순서(인덱스 순서)로 음악 제목만 저장
    for idx, info in enumerate(musicinfos): # 들어온 순서 저장하기 위해 enumerate로 인덱스도 같이 추출
        start, end, title, notes = info.split(",")  # 재생시각, 종료시각, 제목, 악보
        elapsed = (int(end[:2]) * 60 + int(end[3:])) - (int(start[:2]) * 60 + int(start[3:]))  # 시작, 종료 시간을 시간*60+분으로 계산하여 빼기 -> 실행시간 분으로 저장
        notes = replace(notes) # #붙는 음들 전처리해서 저장
        notes_whole = (elapsed//len(notes))*notes + notes[:elapsed%len(notes)] # 실행시간/악보 길이 == 전체 악보가 반복된 정도, 실행시간mod악보 길이 == 전체를 반복하지 못하고 남은 음들
        music.append([notes_whole, elapsed, idx])  # 악보,재생길이,재생순서 저장
        titles.append(title)  # 들어온 순서대로 노래 제목 저장 
    answer = []
    for ele in music: # ele = [notes_whole, elapsed, idx]
        if replace(m) in ele[0]: # 실행시간 만큼 반복한 악보에 replace() 처리한 m의 음정들이 있다면 
            answer.append([ele[1],ele[2]]) # answer에 재생시간, 인덱스 저장
    if not answer: # 일치하는 악보가 없다면 
        return "(None)" 
    else# 일치하는 악보가 있다면
        answer.sort(key=lambda x: x[0],reverse=True# 1. 재생시간 Desc, 인덱스 Asc 정렬
        # answer.sort(key=lambda x: (x[0],-x[1]),reverse=True) # 이미 15번째 line에서 asc 순서로 인덱스가 저장되어 정렬할 필요 없음(답은 같음)
        return titles[answer[0][1]] # 실행시간이 가장 긴 곡의 인덱스로 title을 인덱싱
cs

'문제 풀이' 카테고리의 다른 글

[python] n^2 배열 자르기  (0) 2022.08.08
[python] 예상 대진표  (0) 2022.08.06
[Python] [3차] 파일명 정렬  (0) 2022.08.03
[python] 주차 요금 계산  (0) 2022.07.31
[Python] 올바른 괄호  (0) 2022.07.14
Comments