알고리즘/Java

[python] 프로그래머스 방금그곡(카카오 신입공채)

유리코딩 2021. 12. 26. 16:50
반응형

알고리즘

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/

 

반응형