본문 바로가기

Algorithm

[알고리즘] 프로그래머스 파이썬 방금그곡 | 이해하기

728x90

프로그래머스 파이썬 방금그곡 문제.

 

 

https://programmers.co.kr/learn/courses/30/lessons/17683?language=python3 

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

✔︎ 문제

 

✔︎ 입력 형식, 출력 형식, 입출력  예시

 

✔︎ 설명

 

 

 

 


 

✍️ 내가 푼 방법

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 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

 

 

 

 

 

 

 

 

참고자료 :

방금 그곡 풀이 방법 https://bladejun.tistory.com/48

테스트케이스 오류 https://programmers.co.kr/questions/20431

테스트케이스 오류 https://programmers.co.kr/questions/25794

728x90