반응형
알고리즘
python 프로그래머스 방금그곡(카카오 신입공채)
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/17683?language=python3
2. 풀이
- 먼저 #이 붇은 멜로디들을 문자로 바꿔준다
- musicinfos를 for문으로 돌리는데 음악 재생 시간을 분으로 고쳐주고, musicinfos리스트 안의 #이 붙은 문자들도 일반 문자로 바꿔준다
- if문으로 음악길이보다 재생된 시간이 짧은 경우와, 긴경우로 나누어 재생시간에 맞춰 멜로디를 만들어준다
- 음악출력시간, 노래제목, 새로 추출한 멜로디를 넣어 새로운 리스트(li)를 만든다
- 음악 출력시간을 -1과 비교하여 조건에 일치하는 경우를 r리스트에 추가해줌
- r 리스트의 개수가 0개면 (None)을 리턴
- r 리스트의 개수가 1개 이상이면 재생시간이 긴 곡의 이름을 리턴
def solution(m, musicinfos):
li = []
r = []
compare = -1
# #인 멜로디 바꿔주기
m = m.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f').replace('G#', 'g').replace('A#', 'a')
for i in musicinfos:
a = i.split(',')
start = list(map(int, a[0].split(':'))) # 음악 시작시간
end = list(map(int, a[1].split(':'))) # 음악 종료시간
running_time = (end[0]*60 + end[1]) - (start[0]*60 + start[1]) # 재생 시간(분으로 계산)
# 음악 정보에서 #인 멜로디 바꿔주기
at = a[3].replace('C#', 'c').replace('D#', 'd').replace('F#', 'f').replace('G#', 'g').replace('A#', 'a')
if running_time < len(at): # 음악 길이보다 재생된 시간이 짧은 경우
at = at[:running_time] # 처음부터 재생시간만큼만 재생
else: # 음악길이보다 재생된 시간이 긴 경우
quotient, remainder = divmod(running_time, len(at)) # 몫, 나머지 = divmod(러닝타임, 멜로디 길이)
at = quotient*at + at[:remainder] # 반복 되기 때문에 몫에 멜로디를 곱해준 다음, 나머지만큼 멜로디를 더해준다.
li.append([running_time, a[2], at]) # 리스트를 다시 만들어줌(running_time, 노래 제목, 멜로디)
for i in li: # 음악 찾기 리스트 반복
if m in i[2]: # 들은 멜로디(m)가 i[2]인 at에 포함되어 있다면,
compare = max(compare, i[0]) # -1과 running_time을 비교하여 큰 숫자를 추출
r.append(i) # 조건에 맞는 i가 있다면 r이라는 list에 추가해줌
if len(r) == 0: # r리스트에 개수가 0이라면(조건에 일치하는 음악이 없는 경우)
return '(None)'
else:
for i in range(len(r)): # r리스트의 음악이 1개 이상인경우 반복문을 돌려준다.
if compare == r[i][0]: # 재생시간이 제일 긴 음악인지 확인
return r[i][1] # 재생시간이 길다면 제목을 return 해줌
[새로학습한 내용]
목과 나머지를 구하는 함수 : divmod
a = 7
b = 5
print(a//b, a%b) # 1 2
a = 7
b = 5
print(*divmod(a, b)) # 1 2
⨳ divmod를 사용할 때 주의할 점
- divmod는 작은 숫자를 다룰 때는 a//b, a%b 보다 느리지만, 큰 숫자를 다룰 때는 더 빠르다.
- 가독성이나, 팀의 코드 스타일에 따라서, a//b, a%b와 같이 쓸 때가 더 좋을 수도 있습니다.
[다른사람의 풀이]
- 자주사용하는 식을 함수로 묶어 처리해주었고
- 여러 과정을 묶어 라인 수를 줄인 풀이 과정이다
# 여러번 사용하는 식의 경우 함수로 묶어 처리
def shap_to_lower(s):
s = s.replace('C#','c').replace('D#','d').replace('F#','f').replace('G#','g').replace('A#','a')
return s
def solution(m,musicinfos):
answer=[0,'(None)'] # [time_len, title]로 배열 만들기
m = shap_to_lower(m) # 네오가 들은 멜로디 중 #이 붙은 멜로디 문자로 바꿔주기
for info in musicinfos:
split_info = info.split(',') # musicinfos리스트를 ,로 자르기
# (끝나는 시간 - 시작시간 #요소의 2번째 글자까지(시간) 추출) * 60을 해서 분으로 바꿔주고, 뒤에 끝나는 시간의 분 - 시작하는 시간의 분을 더해줌
time_length = (int(split_info[1][:2])-int(split_info[0][:2]))*60+int(split_info[1][-2:])-int(split_info[0][-2:])
title = split_info[2] # 제목 추출
part_notes = shap_to_lower(split_info[-1]) # 곡정보의 멜로디 중 #이 붙은 멜로디 문자로 바꿔주기
# 곡전체의 멜로디를 구해줌
full_notes = part_notes*(time_length//len(part_notes))+part_notes[:time_length%len(part_notes)]
if m in full_notes and time_length>answer[0]: # 조건에 맞게 시간과 title을 answer list에 담아줌
answer=[time_length,title]
return answer[-1] # title 출력
[느낀점]
이문제는 카카오 2018년도 신입 공채 채용 3차 시험 문제 4번으로 나왔던 문제이다. 내가 풀었다기 보다는 블로그를 검색해 다른 사람들의 풀이를 보고 이해를 한 것이다. 나같은 초짜가 카카오입사시험문제를 이해했다는것만으로도 감격스러울 뿐이다!! 열심히해서 얼른 올라가보자!!💃
카카오 해설 : https://tech.kakao.com/2017/11/14/kakao-blind-recruitment-round-3/
반응형
'알고리즘 > Java' 카테고리의 다른 글
[python] 백준 스택(10828) (0) | 2022.01.09 |
---|---|
[python] 백준 스택 수열(1874) (0) | 2022.01.09 |
[python] 백준 설탕 배달(2839) (0) | 2021.12.26 |
[python] 달팽이는 올라가고 싶다(2869) (0) | 2021.12.26 |
[python] ACM호텔(10250) (0) | 2021.12.25 |