Programmers Level2 방금 그 곡
돌파구
이 문제에서는 사실 복잡한 자료구조라던가, 이 문제를 풀기위해 꼭 알아야 하는 알고리즘 같은 것은 없다. 주어진 상황을 잘 이해하고, 문제 해결을 할 수 있는지를 확인하는 유형의 문제다. 나는 개인적으로 이런 문제의 유형을 좋아한다. 결국, 실무에서도 상황을 이해하고 문제해결을 하는 능력이 요구되기 때문이다.
이 문제는 단순화 하면, 문자열 비교하는 문제다. 그렇지만, 이 문자열 비교를 하기 전에 조건에 따라 철저한 전처리 과정이 요구된다.
예를들어, 이 문제를 쉽게 해결하는 첫번째 단추는 악보코드의 간결화이다. C, C#, D, D# .. 이런 코드로 구성되어 있는 악보의 문자열을 단순화 해야 한다. 왜냐하면 C나 C# 이나 하나의 코드지만, 문자열에서 C#은 ‘두 칸’을 차지하기 때문이다.
그래서 정규표현식과 replace 메소드를 사용해서 먼저 #이 붙어있는 코드들을 모두 소문자화 했다. 그래서 본래 코드와의 차별화를 했다. => 이렇게 문자열을 먼저 간단화 시켜놓고 나면 뒤에서 비교하는 로직에서 훨씬 더 매끄럽다.
두번쨰로 신경써야 할 로직은, 실제 연주된 시간에 따라 코드의 문자열을 만드는 함수를 구현하는 것이다. 주어진 시작시간과 끝난시간을 통해서 각 곡마다 실제 연주된 분(minitues)를 구할 수 있다. 문제의 조건에서는 1분에 코드 하나가 연주되기 때문에 실제 연주된 분에 따라 실제 연주된 코드를 구할 수 있다. 이 때 연주된 분 / 곡의 코드 길이
를 나누어서 반복된 횟수를 구했고, 나누어 떨어지지 않는 나머지도 처리해서 실제 연주된 마지막 코드까지 처리를 해 주었다.
마지막으로, 필터링을 거쳐서 연주된 코드안에 기억하고 있는 코드가 포함된다면 필터링을 거친 배열에 담는다.
예외처리를 끝까지 할 수 있는지 검증하기 위해서 카카오에서는 두가지 장치를 마련 해 두었는데, 필터링이 된 노래가 2개 이상일 때에는 다음과 같이 처리하도록 하였다.
- 재생시간 긴 음악 제목 return
- 재생시간도 같을 경우 먼저 입력된 음악 제목 return
이 두가지 요구사항은 JavaScript 의 Array 메소드인 sort 를 사용하면 쉽게 처리 할 수 있다.