본문 바로가기
코테 준비

[프로그래머스] 2018 kakao blind recruitment [3차] 방금그곡 (python)

by 박수련 2024. 3. 28.

문제 설명

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

  1. musicinfos에 노래의 재생 시작 시간, 종료 시간, 제목, 음악의 멜로디가 문자열로 주어진다. ("03:00,03:30,FOO,CC#B" 형식)
  2. 시간은 00:00에서 23:59까지이며 멜로디의 음에는 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 가 포함된다.
  3. musicinfos에 있는 재생된 음악 중에 네오가 기억한 멜로디 m이 포함이 되어있는지 확인하고, 여러 개라면 재생시간이 제일 긴 음악 제목을 반환, 재생된 시간이 같다면 먼저 입력된 음악 제목을 반환한다.
  4. musicinfos에 멜로디 m이 포함된 재생음악이 없다면 (None)을 반환한다.

 

접근

  1. 지난번 개인정보수집유효기간 문제에서 날짜를 계산해줄 때 크게 데였기 때문에, 가장 먼저 재생 시간을 작은 단위인 분으로 바꿔 계산해줘야겠다고 생각했다.
  2. 그 뒤에 네오가 기억한 멜로디가, 노래의 길이보다 길다면 재생시간만큼 노래를 이어붙여주고, 짧다면 멜로디만큼 노래 길이를 잘라주었다.
  3. 2번에서 만들어진 노래에 네오가 기억한 멜로디가 있는지 확인하고 있다면 후보 배열에 추가했다.
  4. 마지막으로 후보가 여러 개라면 정렬을 해서 조건에 맞는 값을 반환하고, 하나일 때는 그대로 반환, 없다면 (None)을 반환했다. 

 

틀림

 

하지만.. 음에 #이 있다는 것을 간과해서 틀렸다. 

문자열로는 #이 포함된 음을 구분짓기 어렵기 때문에 음 단위로 쪼개 배열로 만들어주었다.

 

배열로 만들다보니 노래에 네오가 기억한 멜로디를 찾을 때, m in play라는 연산자를 쓸 수 없게 되었다.(문자열만 가능)

이를 해결하기 위해 for문을 돌리면서 play의 특정구간이 memory 배열과 일치하는지 일일이 비교하고, 일치한다면 추후 반환값 선별을 위해 재생시간과 입력순서, 제목을  tmp 배열에 넣어주었다.

 

코드

def solution(m, musicinfos):
    answer = ""

    tmp = []
    cnt = 0
    for info in musicinfos:
        arr = info.split(",")

        # 시간 계산 -> 분
        srt_time = list(map(int, arr[0].split(":")))
        end_time = list(map(int, arr[1].split(":")))

        time = (end_time[0] * 60 + end_time[1]) - (srt_time[0] * 60 + srt_time[1])

        # 악보를 배열로 옮기기
        music = []
        for i in arr[3]:
            if i == "#":
                music[-1] += "#"
                continue
            music.append(i)

        # m을 배열로 옮기기
        memory = []
        for i in m:
            if i == "#":
                memory[-1] += "#"
                continue
            memory.append(i)

        # 재생된 음 구하기
        music_len = len(music)
        if time > music_len:
            play = music * (time // music_len) + music[0 : time % music_len]
        elif time < music_len:
            play = music[0:time]
        else:
            play = music

        # m이 재생되는 악보에 포함된다면 후보에 추가
        play_len = len(play)
        m_len = len(memory)
        for i in range(play_len - m_len + 1):
            if memory == play[i : i + m_len]:
                tmp.append((time, cnt, arr[2]))
                break

        cnt += 1

    if len(tmp) > 1:
        tmp.sort(key=lambda x: (-x[0], x[1]))
        return tmp[0][2]
    elif len(tmp) == 1:
        return tmp[0][2]
    else:
        return "(None)"

 

 

회고

 처음부터 문제 제대로 파악하기.