문제
https://school.programmers.co.kr/learn/courses/30/lessons/17683
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
뭔가 쉬운데 어디선가 계속 문제가 발생해서 생각보다 까다로운 문제였다.
구현문제는 역시 힘들다.
풀이
1. 먼저 replaceAll을 통해 네오가 기억한 멜로디(m)의 A#, C#, D#, F#, G#을 다른 문자열로 대체해준다. 나는 a, c, d, f, g로 대체해주었다.
2. musicinfo의 각 요소에 대해 split 함수를 이용하여 split 해준다. 그리고 음악에 대해서 1번처럼 문자열을 대체한다.
3. 라디오의 시작 시간과 끝 시간을 ":"에 대해 split 한다.
4. 그리고 끝시간과 시작 시간과의 차이를 구한다.
5. 음악 곡의 길이가 라디오 시간보다 길면 그냥 substring을 해주면 된다. 라디오 시간을 끝으로 하면 된다.
6. 라디오 시간이 더 길면 몫과 나머지를 구해서 몫만큼 음악을 붙이고 나머지 만큼 substring하면 된다.
7. contains 함수를 이용하여 문자열 포함여부를 확인한다. 포함되면 list에 저장한다.
8. 리스트에 여러개가 있을 수 있으므로 라디오 시간에 대해 sorting을 하고 맨 앞의 값이 답이 된다.
코드
import java.util.*;
class Solution {
public String solution(String m, String[] musicinfos) {
List<Music> musicList = new ArrayList<>();
m = m.replaceAll("A#", "a");
m = m.replaceAll("C#", "c");
m = m.replaceAll("D#", "d");
m = m.replaceAll("F#", "f");
m = m.replaceAll("G#", "g");
int mLen = m.length();
for(int i=0;i<musicinfos.length;i++){
String arr [] = musicinfos[i].split(",");
arr[3] = arr[3].replaceAll("A#", "a");
arr[3] = arr[3].replaceAll("C#", "c");
arr[3] = arr[3].replaceAll("D#", "d");
arr[3] = arr[3].replaceAll("F#", "f");
arr[3] = arr[3].replaceAll("G#", "g");
System.out.println(arr[3]);
String endTime[] = arr[1].split(":");
String startTime[] = arr[0].split(":");
int duration = 0;
int endHour = Integer.parseInt(endTime[0]);
int startHour = Integer.parseInt(startTime[0]);
int hour = endHour - startHour;
duration = 60*hour+Integer.parseInt(endTime[1]) - Integer.parseInt(startTime[1]);
if(duration <= 0) continue;
String music = "";
int musicLen = arr[3].length();
if(musicLen > duration){
music = arr[3].substring(0, duration);
}
else{
int portion = duration / musicLen;
int mod = duration % musicLen;
for(int j=0;j<portion;j++){
music += arr[3];
}
if(mod != 0)
music += arr[3].substring(0, mod);
}
if(music.length() < mLen) continue;
if(music.contains(m)) {
musicList.add(new Music(arr[2], duration));
}
}
if(musicList.size()==0) return "(None)";
Collections.sort(musicList, (o1, o2)->o2.duration-o1.duration);
return musicList.get(0).title;
}
public class Music {
String title;
int duration;
public Music(String title, int duration){
this.title = title;
this.duration = duration;
}
}
}