🤔 문제
https://programmers.co.kr/learn/courses/30/lessons/17683?language=python3
😀 풀이
방금그곡 문제는 문제 조건에 따라 충실히 구현하면 되는 문제입니다. 각 음악 정보에 대해서 시간 길이만큼 음을 반복하여 배열에 넣어주고 이 배열이 네오가 들은 음들을 포함하고 있는지 체크하면 되는 문제입니다. 문제 해결을 위해 필요한 과정들을 함수들로 빼서 구현했는데 음을 배열로 교체하고 이 배열이 네오가 들은 음인지 체크하는 함수는 아래와 같습니다.
1. 음악을 배열로 바꾸는 과정 ( getMusicArr ) => ex) "C#CBBA" => ['C#', 'C', 'B', 'B', 'A']
2. 네오가 들은 음악 배열이 라디오에서 나온 음악 배열과 같은지 체크하는 함수 ( checkSubArray )
ex) checkSubArray( [1, 2, 3], [3, 2, 1, 2, 3] ) => True
문제를 푸는 과정에서 주의할 점은 C#과 같이 #이 들어가는 음정은 하나의 음정으로 처리를 해주어야 합니다. 이 부분은 구현 코드 내의 함수인 getMusicArr에서 체크하여 처리했습니다.
또한,,
조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
위와 같은 조건으로 인해 중복으로 정답이 나올 경우 처리를 해주어야 하는데 이러한 체크를 38 ~ 40 라인에서 처리해주었으니 풀이 코드를 보실때 참고해주시면 좋을 것 같습니다.
💻 풀이 코드는 아래와 같습니다.
def getTime(start, end):
sh, sm = map(int, start.split(':'))
eh, em = map(int, end.split(':'))
time = (eh - sh) * 60 + (em - sm)
return time
def getMusicArr(musicString, time):
result = []
for c in musicString:
if c == '#':
result[-1] += '#'
else:
result.append(c)
if time == 0:
return result
if len(result) >= time:
return result[:time]
result = result * (time // len(result)) + result[:time % len(result)]
return result
def checkSubArray(sub, arr):
length = len(sub)
print(sub, arr)
for i in range(len(arr)):
if sub == arr[i:i + length]:
return True
return False
def solution(m, musicinfos):
answer = "(None)"
answerTime = 0
for info in musicinfos:
start, end, name, music = info.split(',')
time = getTime(start, end)
musicArr = getMusicArr(music, time)
m = getMusicArr(m, 0)
if checkSubArray(m, musicArr):
if answerTime < time:
answer = name
answerTime = time
return answer
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [3차] 파일명 정렬 - Python (0) | 2022.02.01 |
---|---|
[프로그래머스] 보석 쇼핑 - Python (2) | 2022.01.29 |
[프로그래머스] [3차] 압축 - Python (0) | 2022.01.27 |
[프로그래머스] 표 편집 - Python (1) | 2022.01.21 |
[프로그래머스] 양궁대회 - Python (1) | 2022.01.21 |