카카오 코딩테스트 풀이 2 - 방금 그곡 [2018 KAKAO BLIND]

| | 조회 238


[주요 목차]

카카오 코딩테스트 문제 소개

문제 해결 접근법

코드 구현 및 최적화


안녕하세요! 오늘은 2018 카카오 블라인드 코딩 테스트의 '방금 그 곡' 문제를 풀어볼 거예요. 이 문제는 음악의 멜로디를 기반으로 내가 기억하는 곡을 찾는 알고리즘 문제거든요. 많은 개발자들이 코딩 테스트를 준비하면서 이런 문제를 접하게 되는데, 실제로 이 문제를 풀어보면 다양한 알고리즘적 사고를 발전시킬 수 있어요. 이 글에서는 문제를 이해하고, 어떻게 접근해야 하는지, 그리고 실제 코드 구현까지 다뤄볼게요. 그럼 시작해볼까요?


카카오 코딩테스트 문제 소개

이 문제는 내가 기억한 멜로디가 특정 음악의 일부로 포함되어 있는지를 판단하는 것이에요. 주어진 멜로디와 음악 리스트가 있을 때, 멜로디가 포함된 음악 중 재생 시간이 가장 긴 음악의 제목을 찾아야 합니다. 예를 들어, 멜로디가 'abcdefg'라면, 이 멜로디가 포함된 음악 중 가장 긴 노래의 제목을 반환하는 게 목표입니다. 여기서 중요한 점은 멜로디와 음악의 표현 방식이 다를 수 있어서 이를 잘 처리해야 한다는 점이에요.

문제에서 주어지는 입력값은 각 곡의 재생 시간과 멜로디 정보를 포함하는 문자열입니다. 예를 들어, 음악의 제목, 시작 시간, 종료 시간, 멜로디 순서가 포함된 형태죠. 여기에 주의할 것은 'C#', 'D#'와 같은 음계의 표현이에요. 코드 구현 시 이를 문자열로 치환하는 과정이 필요하거든요.

문제 해결 접근법

문제를 해결하기 위해서는 먼저 주어진 멜로디가 음악에 포함되는지 확인해야 해요. 이를 위해서 멜로디를 반복하여 재생된 결과를 만들어야 합니다. 예를 들어, 멜로디가 3초 동안 'abc'라고 가정하면, 실제로는 'abcabcabc...'와 같이 반복될 수 있죠. 이때 멜로디의 길이와 음악의 재생 시간을 고려하여 반복 횟수를 계산해야 해요.

따라서, 먼저 멜로디의 길이를 계산하고, 주어진 재생 시간에 따라 멜로디가 몇 번 반복될지를 계산해야 합니다. 이때 사용될 수 있는 함수가 바로 math.ceil이에요. 이를 통해 멜로디가 몇 번 반복되어야 하는지를 쉽게 구할 수 있습니다.

이후, 반복된 멜로디에서 내가 기억하는 멜로디가 포함되어 있는지를 확인하는 작업이 필요해요. 파이썬의 in 연산자를 사용하면 매우 간단하게 확인할 수 있죠. 모든 음악을 순회하면서 이 과정을 반복하게 되면, 결과적으로 가장 긴 재생 시간을 가진 음악의 제목을 찾을 수 있습니다.

코드 구현 및 최적화

이제 본격적으로 코드를 구현해볼게요. 우선 음악 정보를 처리하기 위해서 문자열을 파싱하는 함수부터 만들어야 해요. 아래 코드를 참고해보세요:

```python import math

def replace_sharp(melody): return melody.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f').replace('G#', 'g').replace('A#', 'a')

def find_music(melody, music_info): max_play_time = -1 answer = None

for info in music_info:
    start_time, end_time, title, music_melody = info
    play_time = end_time - start_time
    music_melody = replace_sharp(music_melody)

    # 반복하여 멜로디 생성
    repeat_count = math.ceil(play_time / len(melody))
    played_melody = melody * repeat_count
    played_melody = played_melody[:play_time]  # 실제 재생 시간에 맞춰 자르기

    if melody in played_melody and play_time > max_play_time:
        max_play_time = play_time
        answer = title

return answer if answer else "(None)"

```

위 코드는 멜로디를 치환하고, 음악 정보를 순회하며 멜로디가 포함되어 있는지 확인하는 전체 과정을 포함하고 있어요. 음악의 재생 시간을 계산하는 부분도 고려되어 있죠.

이 코드는 효율적으로 동작하며, 알고리즘의 복잡도를 최소화하기 위해 문자열 처리와 반복 계산을 최적화했습니다. 실제로 테스트해보면, 주어진 데이터에 대해 올바른 결과를 반환하는 것을 확인할 수 있어요.

마지막으로, 코드를 작성하고 나면 항상 자신의 코드가 최적화되어 있는지, 가독성이 좋은지 다시 한번 점검하는 것이 좋습니다. 이를 통해 더 나은 개발자로 성장할 수 있거든요.


[자주 묻는 질문]

'방금 그 곡' 문제에서 가장 중요한 점은 무엇인가요?

이 문제에서 가장 중요한 점은 멜로디의 표현 방식과 음악의 재생 시간을 정확히 이해하는 것입니다. 특히, 'C#'과 같은 음계의 치환과 멜로디의 반복 횟수를 계산하는 것이 핵심이죠.

멜로디가 음악에 포함되어 있는지를 어떻게 확인하나요?

멜로디가 음악에 포함되어 있는지를 확인하기 위해, 음악의 재생 시간에 맞춰 멜로디를 반복합니다. 이후 `in` 연산자를 통해 원하는 멜로디가 포함되어 있는지를 쉽게 확인할 수 있습니다.

코드 구현 시 어떤 점을 최적화해야 하나요?

코드 구현 시 문자열 처리와 반복 계산을 최적화하는 것이 중요합니다. 불필요한 반복을 줄이고, 효율적인 데이터 구조를 사용하는 것이 성능 향상에 큰 도움이 됩니다. 또한, 가독성을 높이기 위해 함수와 변수를 의미 있게 네이밍하는 것도 중요합니다.

목록
글쓰기
한국 서버호스팅
전체보기 →

댓글 0

jpg/png/gif/webp/zip · 최대 100MB · 10개

리뷰

0
0건의 리뷰
5★
0
4★
0
3★
0
2★
0
1★
0
0/5000
아직 작성된 리뷰가 없습니다. 첫 리뷰를 남겨주세요!