정렬, 구현
1. C, C#, D, D# 등 #이 붙은 것과 안 붙은 것들을 어떻게 처리해 줄 것인가?
-> C#, D#은 모두 java의 문자열 메소드인 replaceAll 로 C,D,E,F,G,A,B 와 겹치지 않는 Y,U,I,O,P 로 대체하여서 1글자로 처리하였다.
2. 다음의 조건을 어떻게 처리할 것인가?
조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
Music 클래스를 선언해서, Music 타입의 배열을 만든다. 그리고 그 배열에 제목, 총 실행 시간, 시작 시간을 기록해서 Comparator 을 이용해서 비교하여 정렬한다.
3. 시, 분 을 어떻게 처리할 것인가?
끝 시간에서 시작 시간을 뺄 때, 시간의 뺄셈에서 처리하기가 복잡하므로, 시간 x 60 + 분으로 환산하여 처리한다. 예를 들어, 03시 20분은 3 x 60 + 20 = 200 분이 된다.
(None)
을 리턴하고, 배열이 비어있지 않다면, 정렬한 0번째 인덱스 값의 title을 리턴한다.import java.util.*;
class Music{
String title;
int length;
int startTime;
Music(String title,int length,int startTime){
this.title=title;
this.length=length;
this.startTime=startTime;
}
}
class Solution {
public String solution(String m, String[] musicinfo) {
String k = replace(m,musicinfo);
ArrayList<Music> list=new ArrayList<>();
for(int i=0;i<musicinfo.length;i++){
String musicinfos[]=musicinfo[i].split(",");
String time1=musicinfos[0];
String time2=musicinfos[1];
String title=musicinfos[2];
String cycle=musicinfos[3];
String temp1[]=time1.split(":");
String temp2[]=time2.split(":");
int s_time= Integer.parseInt(temp1[0])*60 + Integer.parseInt(temp1[1]);
int e_time= Integer.parseInt(temp2[0])*60 + Integer.parseInt(temp2[1]);
String now="";
int totalTime=e_time-s_time;
for(int j=0;j<totalTime;j++){
now+= cycle.charAt(j%cycle.length());
}
if(now.contains(k)){
list.add(new Music(title,totalTime,s_time));
}
}
Collections.sort(list,new Comparator<>(){
@Override
public int compare(Music m1,Music m2){
if(m1.length<m2.length) return 1;
else if(m1.length==m2.length){
if(m1.startTime>m2.startTime) return 1;
}
return -1;
}
});
if(list.isEmpty()) return "(None)";
String answer=list.get(0).title;
return answer;
}
public static String replace(String m,String[] musicinfo) {
for(int i=0;i<musicinfo.length;i++){
String musicinfos[] = musicinfo[i].split(",");
musicinfos[3]= musicinfos[3].replaceAll("C#","Y");
m=m.replaceAll("C#","Y");
musicinfos[3]= musicinfos[3].replaceAll("D#","U");
m=m.replaceAll("D#","U");
musicinfos[3]= musicinfos[3].replaceAll("F#","I");
m=m.replaceAll("F#","I");
musicinfos[3]= musicinfos[3].replaceAll("G#","O");
m=m.replaceAll("G#","O");
musicinfos[3]= musicinfos[3].replaceAll("A#","P");
m=m.replaceAll("A#","P");
musicinfo[i]=musicinfos[0]+","+musicinfos[1]+","+musicinfos[2]+","+musicinfos[3];
}
return m;
}
}
문제 난이도에 비해 꽤 오래걸렸다.
중간 중간 오타도 많이 쳤고, YUIOP 로 대체하는 걸, QWERT 로 대체했는데, E 가 이미 있어서
-> 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
그 오류를 찾는다고 애먹었다.
다음부터는 초반에 설계를 더 꼼꼼하게 해놓아야겠다고 생각했다.
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212