프로그래머스 - 방금 그곡

이숭인·2021년 6월 30일
0

알고리즘 문제풀이

목록 보기
9/17

문제 바로가기

문제풀이

생각보다 어렵진 않았다. 생각보단..

내 생각에 이 문제를 푸는데에 가장 핵심은

  1. "A#" , "A" "B#", "B" .... 등 #이 포함된 악보의 알파벳을 어떻게 구분하느냐.

  2. 문제에서 주어진 "음악 길이보다 재생된 시간이 긴 경우 끊김없이 반복재생",
    "음악 길이보다 재생된 시간이 짧을때는 처음부터 재생 시간만큼만 재생"
    .
    위 두 조건을 잊지말고 만족하도록 로직을 구성해야 한다.

뭐,, 1번 방법은 여러가지가 있겠지만 A# 혹은 B# 같은 문자를 하나의 문자로 치환하는 방법이 가장 쉬운 방법같다
(A# -> a , B# ->b , C# -> c .. 이런식으로 치환했다.)

대충 풀이 순서를 정리해보자면,

  • 내가 들은 멜로디(m)에서 #이 들어간 문자가 있을지 모르니 convert함수를 사용해 내가 사용하고싶은대로 치환한다.

  • musicinfos에 저장된 음악의 정보들을 for문을 이용해 각각의 음악 정보에 접근한다.

  • 음악이 실행된 시간을 계산한다. (calTime이라는 함수를 정의해서 구했다.)

  • 음악의 악보 정보를 convert를 이용해 내가 원하는 문자열로 치환한다.(이전에 내가 들은 멜로디를 치환하듯이)

  • 음악의 실행시간 동안 흘러나오는 멜로디 악보 문자열을 만든다. (문제의 조건을 잘봐야함)

  • 다른 경우는 상관없지만, 조건을 만족하는 음악이 여러개일 경우
    1. 재생시간이 가장 긴 순서

만약 조건을 만족하는 음악들의 재생시간이 모두 같다면,

2. 음악이 재생된 순서

를 우선으로 반환해야한다. (조건 만족하지않으면 None리턴)

풀이 코드:

def solution(m,musicinfos):
    m = convert(m)
    matchList = list()
    for info in musicinfos:
        start , end, name, akbo = info.split(",")
        playTime = calTime(start,end)
        akbo = (convert(akbo))
        akbo = ''.join((list(map(''.join,[akbo[i % len(akbo)] for i in range(playTime)]))))
        if m in akbo:
            matchList.append([name, len(akbo)])

    print(matchList)
    if len(matchList) == 0:
        return "(None)"
    elif len(matchList) == 1:
        return matchList[0][0]
    else:
        return sorted(matchList,key=lambda x:-x[1])[0][0]

def calTime(start,end):
    start = list(map(int,start.split(":")))
    end = list(map(int,end.split(":")))

    return ((end[0] - start[0]) * 60) + (end[1] - start[1])

def convert(s):
    s = ''.join(s)
    return s.replace("C#","c").replace("D#","d").replace("E#","e").replace("F#","f").replace("G#","g").replace("A#","a")
profile
iOS Developer

0개의 댓글