본문 바로가기
프로그래머스/Python

[프로그래머스] [3차] 방금그곡 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 11. 13.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

해당 문제는 각 음악의 정보를 가지고 재생된 시간을 확인하고 재생된 내용을 구한다.

이후 재생된 내용에 기억한 멜로디가 있는지 확인한다.

여기서 각 음악의 정보에는 # 문자가 포함되어 있기에 하나의 문자열로 된 악보 정보과 기억한 멜로디의 각 음을 분리할 때 문자열을 각 문자로 분리하고 # 문자를 고려해줘야 한다.

 

  1. 가능한 모든 결과를 저장할 리스트를 생성한다. result = list()
  2. 방송된 곡의 정보를 하나씩 불러오며 for i in musicinfos
  3. 불러온 곡의 정보를 , (콤마) 기준으로 분리하여 리스트로 저장한다. info = i.split(',')
  4. 재생된 전체 시를 구한다. hour = int(info[1].split(':')[0]) - int(info[0].split(':')[0])
  5. 재생된 전체 분을 구한다. minute = int(info[1].split(':')[1]) - int(info[0].split(':')[1])
  6. 시와 분을 가지고 재생된 총시간을 분으로 구한다. time = hour * 60 + minute
  7. 한 문자열로 구성된 악보 정보를 각 문자로 분리하여 리스트로 저장한다. music = list(info[-1])
  8. # 문자를 붙여줘야 하는데 인덱스를 나타낼 변수를 생성한다. i = 1
  9. 인덱스가 악보 정보의 길이를 넘어가거나 # 문자가 없을 때까지 반복한다. while (i < len(music)) and ('#' in music)
  10. 만약 해당 인덱스의 문자가 #이면 if (music[i] == '#')
  11. # 문자를 이전 문자와 결합해 하나의 문자로 만들어 저장한다. music[i - 1] = music[i - 1] + music[i]
  12. # 문자를 악보 정보 리스트에서 제거한다. del music[i]
  13. 반면 # 문자가 아니라면 인덱스를 다음 인덱스로 옮긴다. else: i += 1
  14. 전체 악보 정보의 길이를 저장한다. length = len(music)
  15. 해당 음악이 재생된 내용을 저장한다. play = music * (time // length) + music[ : time % length]
  16. 한 문자열인 기억한 멜로디 정보도 각 문자를 분리해 리스트로 저장한다. m = list(m)
  17. 기억한 멜로디 정보 또한 # 문자를 이전 문자에 붙여준다. i = 1
  18. 인덱스가 멜로디의 길이를 넘어가거나 # 문자가 없을 때까지 반복한다. while (i < len(m)) and ('#' in m)
  19. 만약 해당 인덱스의 문자가 #이면 if (m[i] == '#')
  20. # 문자를 이전 문자와 결합해 하나의 문자로 만들어 저장한다. m[i - 1] = m[i - 1] + m[i]
  21. # 문자를 멜로디 리스트에서 제거한다. del m[i]
  22. 반면 # 문자가 아니라면 인덱스를 다음 인덱스로 옮긴다. else: i += 1
  23. 음악의 재생된 내용을 가지고 기억한 멜로디의 부분이 있는지 확인한다. for i in range(len(play) - len(m) + 1)
  24. 만약 해당 재생된 부분이 기억한 멜로디와 동일하면 if (play[i : i + len(m)] == m)
  25. 해당 음악의 제목과 재생된 시간을 추가한다. result.append([info[2], time])
  26. 음악이 재생되었다는 것을 확인했으므로 확인을 종료한다. break
  27. 모든 음악을 확인한 후, 만약 가능한 모든 결과의 리스트에 결과가 있다면 if (len(result) > 0)
  28. 재생 시간이 긴 순서대로 정렬한다. result.sort(key = lambda x : x[1], reverse = True)
  29. 제일 앞에 오는 정보의 음악 제목을 저장한다. answer = result[0][0]
  30. 반면에 가능한 결과가 없다면 (None)을 저장한다. else: answer = '(None)'
반응형

3. 소스코드

def solution(m, musicinfos):
    answer = ''
    
    result = list()
    for i in musicinfos:
        info = i.split(',')
        
        hour = int(info[1].split(':')[0]) - int(info[0].split(':')[0])
        minute = int(info[1].split(':')[1]) - int(info[0].split(':')[1])
        time = hour * 60 + minute
        
        music = list(info[-1])
        i = 1
        while (i < len(music)) and ('#' in music):
            if (music[i] == '#'):
                music[i - 1] = music[i - 1] + music[i]
                del music[i]
            else:
                i += 1

        length = len(music)
        play = music * (time // length) + music[ : time % length]
        
        m = list(m)
        i = 1
        while (i < len(m)) and ('#' in m):
            if (m[i] == '#'):
                m[i - 1] = m[i - 1] + m[i]
                del m[i]
            else:
                i += 1

        for i in range(len(play) - len(m) + 1):
            if (play[i : i + len(m)] == m):
                result.append([info[2], time])
                break
        
    if (len(result) > 0):
        result.sort(key = lambda x : x[1], reverse = True)
        answer = result[0][0]
    else:
        answer = '(None)'
    
    return answer
728x90
반응형