[프로그래머스] 17683. 방금그곡
문제 링크
풀이 과정
주어진 악보
를 재생 시간
만큼 이어 붙여 네오가 기억하고 있는 멜로디(m)
가 해당 악보에 속해있는 지 파악하는 문제입니다.
문제에는 다음과 같이 C, C#, D, D#, E, F, F#, G, G#, A, A#, B
의 총 12개의 음이 사용됩니다. 샵(#)을 포함하는 멜로디가 존재할 시, 하나의 음을 두 개의 문자로 표현하기 때문에, 문자열을 순회하면서 불필요한 인덱스 검사와 올바르지 않은 인덱스 참조로 인해 런타임 에러가 발생할 수 있습니다.
public static String convert(String melody) {
melody = melody.replaceAll("A#", "a");
melody = melody.replaceAll("C#", "c");
melody = melody.replaceAll("D#", "d");
melody = melody.replaceAll("F#", "f");
melody = melody.replaceAll("G#", "g");
return melody;
}
convert 메소드는 이를 예방하기 위한 함수입니다. 다음과 같이 샵이 붙은 다섯 개의 음 A#, C#, D#, F#, G#
을 각각 a, c, d, f, g
로 사전에 치환하여, 불필요한 인덱스 검사와 올바르지 않은 인덱스 참조로 인한 에러를 발생시키지 않도록 했습니다.
int playTime = Integer.parseInt(end[1]) - Integer.parseInt(start[1]);
if (!start[0].equals(end[0])) {
int hour_diff = Integer.parseInt(end[0]) - Integer.parseInt(start[0]);
playTime += 60 * hour_diff;
}
음악 재생 시간(HH:MM
)은 종료 시각의 minutes 에서 시작 시간의 minutes 를 빼주었고, hours 에 해당하는 부분이 같지 않으면, hours 차이를 구해 miniutes 로 환산해 더해줬습니다.
public static String makeMelody(String akbo, int playTime) {
String melody = "";
int cnt = 0;
int idx = 0;
while (cnt < playTime) {
if (idx + 1 < akbo.length() && akbo.charAt(idx + 1) == '#') {
melody += akbo.substring(idx, idx + 2);
idx += 2;
} else {
melody += akbo.charAt(idx);
idx += 1;
}
idx = idx % akbo.length();
cnt++;
}
return melody;
}
멜로디는 악보와 재생 시간을 이용해, 재생 시간만큼 악보의 각 음을 붙여 만듭니다. 악보의 각 음이 샵을 포함하는 지 확인하고, 인덱스를 조정해줬습니다.
코드
public class Main {
public static String solution(String m, String[] musicinfos) {
m = convert(m);
String answer = "(None)";
int max = 0;
for (int i = 0; i < musicinfos.length; i++) {
String s = musicinfos[i];
String[] info = s.split(",");
String[] start = info[0].split(":");
String[] end = info[1].split(":");
String name = info[2];
String akbo = info[3];
int playTime = Integer.parseInt(end[1]) - Integer.parseInt(start[1]);
if (!start[0].equals(end[0])) {
int hour_diff = Integer.parseInt(end[0]) - Integer.parseInt(start[0]);
playTime += 60 * hour_diff;
}
String melody = makeMelody(akbo, playTime);
melody = convert(melody);
if (melody.contains(m)) {
if (max < playTime) {
max = playTime;
answer = name;
}
}
}
return answer;
}
public static String convert(String melody) {
melody = melody.replaceAll("A#", "a");
melody = melody.replaceAll("C#", "c");
melody = melody.replaceAll("D#", "d");
melody = melody.replaceAll("F#", "f");
melody = melody.replaceAll("G#", "g");
return melody;
}
public static String makeMelody(String akbo, int playTime) {
String melody = "";
int cnt = 0;
int idx = 0;
while (cnt < playTime) {
if (idx + 1 < akbo.length() && akbo.charAt(idx + 1) == '#') {
melody += akbo.substring(idx, idx + 2);
idx += 2;
} else {
melody += akbo.charAt(idx);
idx += 1;
}
idx = idx % akbo.length();
cnt++;
}
return melody;
}
public static void main(String[] args) {
String m = "ABCDEFG";
String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// String m = "ABC";
// String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// String m = "CCB";
// String[] musicinfos = {"03:00,03:10,FOO,CCB#CCB", "04:00,04:08,BAR,ABC"};
solution(m, musicinfos);
}
}
댓글남기기