-
[프로그래머스] [3차] 방금그곡알고리즘 2023. 9. 9. 20:11
문제
라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다.
그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다.
네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다.
그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다.반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다.
그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가정을 할 때 네오가 찾으려는 음악의 제목을 구하여라.
방금그곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.
네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다.음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.
음악이 00:00를 넘겨서까지 재생되는 일은 없다.
조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
조건이 일치하는 음악이 없을 때에는 “(None)”을 반환한다.풀이
야호~ 카카오다.
고려해야 할 사항이 많았다.
주어진 음계를 치환하는 것이 풀이하는데 유리할 것 같아서 치환하기로 하였다.
이때 고려해야 할 사항들이 있다.- 필자는 C# -> c 처럼 치환을 하였다.
- 이때 주어진 음계는 아니지만 #이 붙을 수 있다.
- 예를 들어 E#은 그냥 아무것도 아니다. 따라서 그냥 #을 빈문자로 치환하였다.
str.replace("C#", "c").replace("D#", "d").replace("F#", "f").replace("G#", "g").replace("A#", "a").replace("#", "");
또한 시간 계산시 시, 분을 따로 계산해야 한다.
시 차이는 1시간 이상도 차이날 수 있기 때문에 주의하자. 필자는 여기서 많이 시간이 걸렸다.
또한 substring시 범위 조정을 주의하여 작성하자.이 요소들만 고려하면 에러들을 피할 수 있을 것이다.
import java.lang.*; import java.util.*; class Solution { public String solution(String m, String[] musicinfos) { String answer = "(None)"; int len = 0; m = replace(m); for(int i = 0; i < musicinfos.length; i++) { String[] musicInfo = musicinfos[i].split(","); String startTime = musicInfo[0]; String endTime = musicInfo[1]; String title = musicInfo[2]; String note = replace(musicInfo[3]); int timeGap = getTime(startTime, endTime); String totalNote = getTotalNote(note, timeGap); if (totalNote.contains(m)) { if (answer.equals("None")) { answer = title; len = timeGap; } else if (len < timeGap) { answer = title; len = timeGap; } } } return answer; } static String replace(String str) { return str.replace("C#", "c").replace("D#", "d").replace("F#", "f").replace("G#", "g").replace("A#", "a").replace("#", ""); } static int getTime(String startTime, String endTime) { String[] start = startTime.split(":"); String[] end = endTime.split(":"); if (start[0].equals(end[0])) { return Integer.parseInt(end[1]) - Integer.parseInt(start[1]); } else { return (Integer.parseInt(end[0]) - Integer.parseInt(start[0])) * 60 + Integer.parseInt(end[1]) - Integer.parseInt(start[1]); } } static String getTotalNote(String note, int length) { String totalNote = ""; if (note.length() >= length) { totalNote = note.substring(0, length); } else { int gap = length / note.length(); for(int i = 0; i < gap; i++) { totalNote += note; } totalNote += note.substring(0, length % note.length() + 1); } return totalNote; } }
728x90'알고리즘' 카테고리의 다른 글
[프로그래머스] 최댓값과 최솟값 (0) 2023.09.12 [프로그래머스] 마법의 엘리베이터 (0) 2023.09.11 [프로그래머스] 최대공약수와 최소공배수 (0) 2023.09.09 [프로그래머스] 정수 내림차순으로 배치하기 (1) 2023.09.09 [프로그래머스] 신규아이디추천 (0) 2023.09.06