이번에 풀어본 문제는
프로그래머스 방금그곡 입니다.
import java.util.PriorityQueue;
import java.util.Queue;
class Music {
int time;
String title;
public Music(int time, String title) {
this.time = time;
this.title = title;
}
}
class Solution {
public String solution(String m, String[] musicinfos) {
String inputMusic = convertMusic(m);
Queue<Music> pq = new PriorityQueue<>((o1,o2) -> o2.time - o1.time);
for (String music : musicinfos) {
String [] arr = music.split(",");
//time
int originTime = getTimeFromString(arr[0], arr[1]);
int time = originTime;
String title = arr[2];
String convertedOriginMusic = convertMusic(arr[3]);
int originMusicLen = convertedOriginMusic.length();
String targetMusic = convertedOriginMusic;
// 더 짧게 들은경우
if (time < originMusicLen) {
targetMusic = convertedOriginMusic.substring(0, time);
}
// 크거나 같음
else {
time -= originMusicLen;
while (time > originMusicLen) {
targetMusic += convertedOriginMusic;
time -= originMusicLen;
}
targetMusic += convertedOriginMusic.substring(0, time);
}
// 일치하는 문자열이 존재한다면
if (targetMusic.length() > targetMusic.replace(inputMusic,"").length()) {
pq.add(new Music(originTime, title));
}
}
return pq.isEmpty() ? "(None)" : pq.poll().title;
}
static int getTimeFromString(String start, String end) {
String [] startTime = start.split(":");
String [] endTime = end.split(":");
int hour = (Integer.parseInt(endTime[0]) - Integer.parseInt(startTime[0])) * 60;
int min = Integer.parseInt(endTime[1]) - Integer.parseInt(startTime[1]);
return hour + min;
}
static String convertMusic(String music) {
String result = music;
result = result.replace("A#","a");
result = result.replace("C#","c");
result = result.replace("D#","d");
result = result.replace("F#","f");
result = result.replace("G#","g");
return result;
}
}
주어진 입력으로 일치하는 문자열(악보)를 찾는 문제입니다.
들은 시간이 기존 악보보다 길경우, 해당 시간만큼 악보를 이어붙여 주고 입력값과 비교해주면 해결할 수 있습니다.
A#, C#, D# 등의 값들은 길이는 2이지만 한 음당 1분 듣는다는 조건이 존재하고, 해당 값들을 문자열로 체크하려면 A, C, D와 겹치지 않도록 문자열을 변경해야합니다. 저는 소문자 알파벳을 택했지만, 어떤 문자로 변경하던지 큰 상관은 없습니다.
생각보다 까다로운 문제였습니다. 그래도 재밌는 문제네요!