프로그래머스 파이썬 방금그곡 문제.
https://programmers.co.kr/learn/courses/30/lessons/17683?language=python3
✔︎ 문제
✔︎ 입력 형식, 출력 형식, 입출력 예시
✔︎ 설명
✍️ 내가 푼 방법
def solution(m, musicinfos):
answer = []
# '#' 코드 바꾸기
def change_mark(string) :
string = string.replace('C#', 'c')
string = string.replace('D#', 'd')
string = string.replace('F#', 'f')
string = string.replace('G#', 'g')
string = string.replace('A#', 'a')
return string
for musicinfo in musicinfos:
# 재생 시간 구하기
start_time = int(musicinfo.split(',')[0].split(':')[0])*60 + int(musicinfo.split(',')[0].split(':')[1])
finish_time = int(musicinfo.split(',')[1].split(':')[0])*60 + int(musicinfo.split(',')[1].split(':')[1])
play_time = finish_time - start_time
# 내가 떠올린 코드(멜로디) (#변환)
m = change_mark(m)
# 악보 코드 구하기 (#변환)
music_code = musicinfo.split(',')[3]
music_code = change_mark(music_code)
music_code_len = len(music_code)
quotient = play_time // music_code_len
music_code = (music_code*(quotient+1))[:play_time]
# 음악 찾기
# 음악
music = musicinfo.split(',')[2]
if m in music_code:
answer.append((music, play_time))
answer = sorted(answer,key=lambda x:-x[1])
if answer == []:
return '(None)'
else:
return answer[0][0]
수십번의 테스트 오류를 지나 위와 같은 코드로 통과했다.
12, 15, 18, 19, 20, 21, 22, 23, 24, 26, 28, 29, 30 오류 -> 12 15 18 19 26 28 30 -> 22 23 24 29 통과!
신경써야할 것(풀이방법)
- #를 어떻게 해야할 지 -> C#, G# 같은 애들을 아예 소문자로 바꿔줘서 하나의 문자로 처리하게 해준다.
- 재생시간 구하기 -> 12:05이라면, 12 * 60 + 5를 해준다.
- 악보 코드 구하기 -> 써있는 것은 ABCDABC 7자리이지만, 재생시간이 14분일 경우, 이것을 한 번 반복해서 14로 만들어주어야한다. 이 경우, 재생시간//써있는 악보코드+1로 한 다음 재생시간 만큼만 잘라주면 된다. +1을 한 이유는, 홀수면 안 나누어 떨어질 수도 있고, 몫이 0이 될 경우도 있기 때문이다.
- 재생시간 별로 정렬하기 -> answer을 만들어 줄때, 음악제목, 재생시간을 같이 넣어준다. 그 다음 sorted 메소드를 사용해서 재생시간 별로 정렬하면 된다.
- 먼저 입력된 순서대로 -> 출력할 때 배열 맨 앞을 출력해준다.
✨참고 sorted(정렬하고 싶은 것, key=lambda x:-x[원하는 정렬기준 인덱스 넘버])
-x 인 경우는 내림차순(긴 음악 순)
✔︎ 자주 나는 테스트 오류 정리
22, 23, 24 테스트 케이스 :
조건에 맞는 음악이 없는 경우 "(None)"을 리턴해야한다.
❗️주의 (None)으로 리턴해야함. 괄호 있는지 확인, N 대문자인지 확인
25, 26, 28 테스트 케이스:
m : "AAB"
musicinfo = ["01:00, 01:20, HAPPY, AAB#AAB, "03:00, 03:15, GOOD, ABC"] 와 같은 예시 일 때,
HAPPY가 출력되어야 한다.
✨해결방법 musicinfo에 #가 있을 때 어떻게 조건을 검사해주어야할 지 고려하기
27, 28 테스트 케이스:
조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
✨ sorted(정렬하고 싶은 것, key=lambda x:-x[원하는 정렬기준 인덱스 넘버])
-x 인 경우는 내림차순(긴 음악 순)
다른 사람들은 어떻게 풀었을까?
https://programmers.co.kr/learn/courses/30/lessons/17683/solution_groups?language=python3
참고자료 :
방금 그곡 풀이 방법 https://bladejun.tistory.com/48
'Algorithm' 카테고리의 다른 글
[알고리즘] 백준 파이썬 2609 최대공약수와 최소공배수 (0) | 2022.03.12 |
---|---|
[알고리즘] 백준 파이썬 1021 회전하는 큐 | 이해하기 (0) | 2022.03.09 |
[알고리즘] 백준 파이썬 1929번 소수 구하기 | 쉽게 이해하기 | 자세한 설명 (0) | 2022.03.04 |
[알고리즘] 백준 파이썬 2839번 설탕배달 | 파이썬 입력하는 법 (0) | 2022.03.02 |
[알고리즘] 프로그래머스 #9 핸드폰 번호 가리기 | replace( ) (0) | 2022.01.21 |