본문 바로가기

Programmers/Level2

[3차] 방금그곡

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