프로그래머스 Lv2. 2018 KAKAO BLIND RECRUITMENT [3차] 방금그곡
네오가 기억한 멜로디 문자열 m과 방송된 곡의 정보를 담고 있는 배열 musicinfos가 주어질 때 네오가 찾으려는 음악의 제목을 구하는 문제이다.
주어진 가정 중에서
1. 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B
2. 각 음은 1분에 1개씩 재생
3. 조건이 일치하는 음악이 여러 개일 경우 "재생된 시간"이 제일 긴 음악 제목을 반환, 재생된 시간이 같을 경우 먼저 입력된 음악 제목을 반환
조건을 주의하며 문제를 풀이하였다.
class Solution {
public String solution(String m, String[] musicinfos) {
String answer = "(None)";
int max = 0;
for (int i = 0; i < musicinfos.length; i++) {
String[] mf = musicinfos[i].split(",");
// 재생 시간 계산
int pt = playtime(mf[0], mf[1]);
// 재생된 코드
String pc = playedcode(pt, mf[3]);
// 재생된 코드에 m이 포함되는지 확인
boolean exist = pc_contain_m(pc, m);
// 가장 긴 재생길이인지 확인
if (exist && pt > max) {
max = pt;
answer = mf[2];
}
}
return answer;
}
private boolean pc_contain_m(String pc, String m) {
boolean exist = false;
for (int i = 0; i <= pc.length() - m.length(); i++) {
if (pc.charAt(i) == m.charAt(0)) {
if (i + m.length() < pc.length() && pc.charAt(i+m.length()) == '#') {
continue;
}
String target = pc.substring(i, i+m.length());
if (target.compareTo(m) == 0) {
exist = true;
}
}
}
return exist;
}
private String playedcode(int pt, String code) {
String pc = "";
String notshap = code.replaceAll("#", "");
int ins = notshap.length();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pt / ins; i++) {
sb.append(code);
}
int count = 0, i = 0;
while (count < pt % ins) {
sb.append(code.charAt(i));
count++;
if(code.charAt(i+1) == '#') {
sb.append('#');
i++;
}
i++;
}
pc = sb.toString();
return pc;
}
private int playtime(String st, String et) {
int pt = 0;
String[] st_arr = st.split(":");
String[] et_arr = et.split(":");
int h = Integer.parseInt(et_arr[0]) - Integer.parseInt(st_arr[0]);
if (h > 0) {
pt = h * 60;
}
pt += Integer.parseInt(et_arr[1]) - Integer.parseInt(st_arr[1]);
return pt;
}
}