1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
class Solution {
public static String changeMelody(String melody) {
melody = melody.replaceAll("C#", "H");
melody = melody.replaceAll("D#", "I");
melody = melody.replaceAll("F#", "J");
melody = melody.replaceAll("G#", "K");
melody = melody.replaceAll("A#", "L");
return melody;
}
public String solution(String m, String[] musicinfos) throws ParseException {
String answer = "(None)";
int maxPlayTime = 0;
m = changeMelody(m);
for (int i = 0; i < musicinfos.length; i++) {
String[] mugicinfo = musicinfos[i].split(",");
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date date1 = format.parse(mugicinfo[0]);
Date date2 = format.parse(mugicinfo[1]);
int timeDiff = (int) (date2.getTime() - date1.getTime()) / (60 * 1000); // 시간 차를 분으로 저장
StringBuilder sb = new StringBuilder();
String music = changeMelody(mugicinfo[3]);
// 해당 시간동안 재생된 멜로디 저장
for (int j = 0; j < timeDiff; j++) {
sb.append(music.charAt(j % music.length()));
}
music = sb.toString();
// 멜로디가 발견 되었을 때, 기존 멜로디 최대 길이보다 더 길 경우에만 저장
if (music.contains(m) && maxPlayTime < timeDiff) {
maxPlayTime = timeDiff;
answer = mugicinfo[2];
}
}
return answer;
}
}
|
cs |
내용은 쉽지만 조건도 많아 처리하기가 까다로운 문제이다.
#이 붙어있는 음을 어떻게 처리하는지가 관건인데, 여기서는 다른 문자로 치환하여 수행하였다.
치환하지 않고 풀었지만, 테스트 케이스 30번이 풀리지 않아 실패했던 코드는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
class Solution {
public String solution(String m, String[] musicinfos) throws ParseException {
String answer = "(None)";
int maxPlayTime = 0;
for (int i = 0; i < musicinfos.length; i++) {
String[] mugicinfo = musicinfos[i].split(",");
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date date1 = format.parse(mugicinfo[0]);
Date date2 = format.parse(mugicinfo[1]);
int timeDiff = (int) (date2.getTime() - date1.getTime()) / (60 * 1000); // 시간 차를 분으로 저장
StringBuilder sb = new StringBuilder(mugicinfo[3]);
int j = 0, pos = 0;
// 해당 시간동안 재생된 멜로디 저장
while (pos < timeDiff) {
char c = mugicinfo[3].charAt(j++ % mugicinfo[3].length());
sb.append(c);
if (c != '#')
pos++;
}
// #이 끝자리 일 경우 추가
if (mugicinfo[3].charAt(j % mugicinfo[3].length()) == '#')
sb.append("#");
String s = sb.toString();
int idx;
// 멜로디가 발견 되었을 때
while ((idx = s.indexOf(m)) != -1) {
// 멜로디 끝에 #이 붙었는지 확인
if (idx + m.length() + 1 <= s.length() && s.charAt(idx + m.length()) == '#') {
s = s.substring(idx + m.length() + 1); // 뒷부분 문자열도 확인
} else {
// 최대 기존 멜로디 길이보다 더 길 경우에만 저장
if (maxPlayTime < timeDiff) {
maxPlayTime = timeDiff;
answer = mugicinfo[2];
}
break;
}
}
}
return answer;
}
}
|
cs |
해결하지는 못했지만 미처 생각하지 못한 조건문이 있던 것으로 판단된다.
'Programmers > Level2' 카테고리의 다른 글
2개 이하로 다른 비트 (0) | 2021.08.06 |
---|---|
행렬의 곱셈 (0) | 2021.08.05 |
괄호 회전하기 (0) | 2021.08.04 |
쿼드압축 후 개수 세기 (0) | 2021.08.03 |
메뉴 리뉴얼 (0) | 2021.08.03 |