반응형
내코드(50점짜리)
더보기
복잡하게 짠 부분이 너무 많다
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
class Solution {
public String solution(String m, String[] musicinfos) {
String answer = "";
int maxCount = 0;
PriorityQueue<Node> pq = new PriorityQueue<>();
for (String s : musicinfos) {
String[] arr = s.split(",");
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
int diffMinutes = 0;
try {
Date date1 = format.parse(arr[0]);
Date date2 = format.parse(arr[1]);
long diff = date2.getTime() - date1.getTime();
diffMinutes =(int) (diff / (60 * 1000) % 60);
} catch (ParseException e) {
e.printStackTrace();
}
String[] sum = new String[diffMinutes];
int circle = 0;
int go = 0;
while (go < diffMinutes) {//시간만큼 문자열 생성
if (circle == arr[3].length()) {//C C # B 계속 가져오는용
circle = 0;
}
char c = arr[3].charAt(circle++);
if (c == '#') {
sum[go-1] += '#';
} else sum[go++] = String.valueOf(c);
}
int count = 0;//m이 해당 문자열에몇번 들어가는지 체크
for (int j = 0; j < diffMinutes-m.length(); j++) {
StringBuilder sb = new StringBuilder();
for(int summing = j; sb.length()<m.length(); summing++){
sb.append(sum[summing]);
}
String cut = sb.toString();
if (cut.equals(m)) {
pq.add(new Node(diffMinutes,arr[2]));
break;
}
}
}
if(pq.size()==0) return "(None)";
else answer = pq.poll().title;
return answer;
}
class Node implements Comparable<Node>{
int time;
String title;
Node(int tm , String tl){
time=tm;
title = tl;
}
@Override
public int compareTo(Node o) {
if(this.time <o.time) return 2;
else if(this.time >o.time) return -2;
else{
if(this.title.length() <o.title.length()) return 1;
else if(this.title.length() >o.title.length()) return -1;
else return 0;
}
}
}
}
혼자 해결하려고했지만, 스파게티코드처럼 짜서 너무 조잡하게 짜버렸다.
* 문제 출제 오류로 27번인가가 통과가 안되는 경우가 있다. 이 테스트 케이스에서 조건에 없던 E#가 등장하기 때문이라고 한다. replaceSharpCord()에 E# -> e 를 추가해주면 된다.
모범코드를 참고해보자.taesan94.tistory.com/146#recentEntries
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
class Solution {
public String solution(String m, String[] musicinfos) throws Exception {
String answer = "(None)";
m = m.replaceAll("C#","c");
m = m.replaceAll("D#","d");
m = m.replaceAll("F#","f");
m = m.replaceAll("G#","g");
m = m.replaceAll("A#","a");
int max = -1 ;
for ( int i = 0; i < musicinfos.length; i++ ) {
String[] music = musicinfos[i].split(",");
SimpleDateFormat f = new SimpleDateFormat("HH:mm", Locale.KOREA);
Date start = f.parse(music[0]);
Date end = f.parse(music[1]);
long diff = end.getTime() - start.getTime() ;
long minute = diff / (1000*60);
String musicInfo = music[3];
musicInfo = musicInfo.replaceAll("C#","c");
musicInfo = musicInfo.replaceAll("D#","d");
musicInfo = musicInfo.replaceAll("F#","f");
musicInfo = musicInfo.replaceAll("G#","g");
musicInfo = musicInfo.replaceAll("A#","a");
StringBuilder sb = new StringBuilder();
boolean contains = false;
int size = musicInfo.length();
// 분이 더 짧다면 조금만돌아야한다.
for ( int j = 0; j < minute; j++ ) {
// 2번만 붙여도 가능한지 여부를 알 수 있다.
if ( sb.toString().length() >= m.length()*2 && j >= musicInfo.length()*2 ) break;
sb.append(musicInfo.charAt(j%size));
if ( sb.toString().length() >= m.length() && sb.toString().contains(m) ){
contains=true;
break;
}
}
if ( contains ) {
// 재생시간이 같은경우 변경하지 않는다.
if ( max == (int)minute ) continue;
// 조건이 일치하는 음악이 여러 개일때는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다.
if ( (int)minute > max ) {
max = (int)minute;
answer = music[2];
}
}
}
return answer;
}
}
반응형
'코딩테스트 > Java' 카테고리의 다른 글
[JAVA] 백준 N과 M(2), DFS 중복X (0) | 2021.03.31 |
---|---|
(2018카카오) 파일명정렬 Java (0) | 2021.03.18 |
(2021카카오) 카드 짝 맞추기 Java (0) | 2021.03.11 |
(2019카카오) 오픈채팅방 Java (0) | 2021.03.02 |
(2021카카오) 프렌즈4블록 Java (0) | 2021.02.23 |