티스토리 뷰
프로그래머스 '[3차] 방금 그 곡' 문제 풀이입니다.
문제 링크
● 문제 간단 설명
멜로디에 해당하는 문자열 'm'과 음악이 플레이된 시간과 멜로디를 담고 있는 플레이리스트 배열 'musicInfos' 두 가지가 주어진다.
플레이리스트 중에서 멜로디를 오래 재생한 곡의 이름을 return 하는 문제이다.
● 문제 해결 방향
멜로디 문자열과 플레이리스트 배열 내 각각의 재생된 멜로디 문자열을 문자마다 1대 1로 비교가 필요하다고 생각했다.
그래서 멜로디 중 'C#', 'D#'과 같은 #을 가지고 있는 멜로디는 c, d와 같이 소문자로 치환해주는 작업을 먼저 해주었다.
다음으로,
플레이 리스트 내의 각 플레이에 대해서 ','로 우선 split 하여 시작시간(startTime), 끝난 시간(EndTime), 노래 이름(name), 멜로디(song)로 구분하였다.
시작시간, 끝시간을 통해 총 플레이 시간을 계산하고,
플레이 시간에 따른 실제 플레이된 풀 멜로디를 만들어,
우리가 찾고자하는 멜로디 m이 풀 멜로디 내에 포함되는지 체크해 주었다.
● 문제 해결 코드
def convertLowerCase(inputString):
while '#' in inputString:
sharpIndex = inputString.find('#');
inputString = inputString.replace(
inputString[sharpIndex - 1:sharpIndex + 1],
inputString[sharpIndex - 1].lower()
)
return inputString
def solution(m, musicinfos):
answer = ''
select_time = 0
m = convertLowerCase(m)
for music in musicinfos:
music = convertLowerCase(music)
startTime, endTime, name, song = music.split(',')
startHour, startMinute = map(int, startTime.split(':'))
endHour, endMinute = map(int, endTime.split(':'))
time = (endHour - startHour) * 60 + endMinute - startMinute
running_music = song*(time//len(song)) + song[:time % len(song)]
if (select_time < time and m in running_music):
select_time = time
answer = name
return answer if answer != '' else '(None)'
convertLowerCase()
convertLowerCase는 멜로디 문자열의 '#'을 없애고 '#'을 포함하고 잇는 멜로디 'C#', 'D#'과 같은 멜로디를 'c', 'd'로 치환하는 함수이다. 멜로디 문자열 내에 #이 없을 때까지 치환을 반복한다.
solution()
우선 문자열을 비교할 수 있게 치환 함수를 적용한다.
다음 플레이 리스트 요소에 대해서 아래 작업을 반복한다.
- 재생 데이터(music)에 대해 치환 함수를 적용한다.
- 재생 데이터를 split하여 시작시간(startTime), 끝난 시간(EndTime), 노래 이름(name), 멜로디(song)로 구분한다.
- 시작 시간과 끝난시간을 통해 플레이 타임을 계산한다.
- 플레이 타임과 멜로디를 통해, 실제 재생된 전체 멜로디를 만들어낸다.
- 전체 멜로디에 주어진 멜로디(m)가 포함되는지 확인한다.
- 이때, 멜로디의 길이가 같다면, 빨리 입력된 음악이 return 되어야 한다.
- 멜로디가 여러 음악에 포함된다면, 플레이 시간이 긴 음악이 return 되어야 하기 때문에,
음악에 멜로디가 포함될 때마다 플레이 시간을 비교하여 적절한 값을 return 한다.
- 해당하는 음악이 없을 경우 '(None)'을 return 하고, 적절한 음악이 있을 경우 그 음악의 이름을 return 해준다.
'C#', 'D#'과 같은 예외 음정을 잘 처리하고,
조건에 해당하는 음악이 많은 경우에 대한 예외처리를 잘해주는 것이 관건이었다고 생각한다.
초반에 예외 음정 처리 부분에서 pop이나 replace를 반복문을 사용하다 보니 런타임 에러가 발생해 많이 헤맸던 것 같고,
convertLowerCase()를 통해 런타임 에러를 해결했지만, 예외처리를 제대로 해주지 않아서 실패가 많이 발생했다.
● 참고
'PYTHON' 카테고리의 다른 글
[프로그래머스/PYTHON] 정수 삼각형 (0) | 2022.06.09 |
---|---|
[프로그래머스/PYTHON] 가장 긴 팰린드롬 (0) | 2022.06.08 |
[프로그래머스/PYTHON] 약수의 개수와 덧셈 (0) | 2022.05.31 |
[프로그래머스/PYTHON] 신고 결과 받기 (0) | 2022.05.30 |
[프로그래머스/PYTHON] 크레인 인형뽑기 게임 (0) | 2022.01.18 |
- Total
- Today
- Yesterday
- AxiosInterceptor
- programmers
- redux
- js
- Transpiler
- webpack
- error
- Preloading
- bundler
- Vue.js
- React.memo
- Repository Pattern
- SOAP API
- 파이썬
- python
- 프로그래머스
- v-for
- Vuex
- React
- redux-thunk
- Vue
- 알고리즘
- GraphQL
- clean code
- 백준
- 상호평가
- SPA
- reactrouter
- TypeScript
- 문제풀이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |