https://school.programmers.co.kr/learn/courses/30/lessons/17683
파싱 + 구현 문제다.
1. 음 전처리하기 (편의상 사용)
- 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
#이 붙은 음들은 문자열 길이 판단 및 비교에 번거로우므로, 전처리한다.
여러 방법이 있겠지만, 나는 소문자로 변환하였다.
2. 재생한 곡 정보 파싱하기
(종료 시각 - 시작 시각)으로 총 시간을 구한다.
(문제 조건에서, 음악이 00:00을 넘어가는 경우는 없으므로 식을 단순하게 놓아도 된다.)
이후 전처리한 악보를 기반으로, idx를 mod 연산하며 풀 악보를 만든다.
3. 정답 해 추가하기
문제에서 해가 여러개 일 때 totalNum이 가장 긴 것이 답이므로, totalNum/title을 list에 넣어준다.
+ 추가 비교 조건에서, totalNum 또한 같다면 "먼저 재생한 곡"을 출력해야 한다.
그러나, 로직에서 먼저 재생한 곡 = idx이며,
sort 이후에도 같은 totalNum을 가진 원소에 한해서는 idx 순서가 변경되지 않으므로 고려하지 않아도 된다.
4. 답 출력하기
이 것 때문에 틀렸다. 해가 없다면
"None"이 아니라 "(None)"을 출력해야한다.
import java.util.*;
class Solution {
public String solution(String m, String[] musicinfos) {
String answer = "";
int M = musicinfos.length;
m = convToLower(m);
List<String[]> list = new ArrayList<>();
for(int i=0; i<M; i++) {
String[] info = musicinfos[i].split(",");
String stInfo = info[0];
String edInfo = info[1];
String title = info[2];
String musicInfo = info[3];
String[] st = stInfo.split(":");
String[] ed = edInfo.split(":");
int stNum = Integer.parseInt(st[0]) * 60 + Integer.parseInt(st[1]);
int edNum = Integer.parseInt(ed[0]) * 60 + Integer.parseInt(ed[1]);
int totalNum = edNum - stNum;
String music = convToLower(musicInfo);
String fullMusic = getFullMusic(music, totalNum);
if(fullMusic.contains(m)) {
list.add(new String[]{String.valueOf(totalNum), title});
}
}
list.sort((s1, s2) -> Integer.valueOf(s2[0]) - Integer.valueOf(s1[0]));
return list.isEmpty()? "(None)" : list.get(0)[1];
}
static String convToLower(String s) {
StringBuilder sb = new StringBuilder();
int S = s.length();
for(int i=0; i<S; i++) {
if(i+1 < S && s.charAt(i+1) == '#') {
sb.append(Character.toLowerCase(s.charAt(i)));
i++;
}
else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
static String getFullMusic(String s, int val) {
StringBuilder sb = new StringBuilder();
int S = s.length();
for(int i=0; i<val; i++) {
sb.append(s.charAt(i % S));
}
return sb.toString();
}
}
'[프로그래머스] PS > Java' 카테고리의 다른 글
[lv3] 외벽 점검 (0) | 2024.12.16 |
---|---|
[lv2] 리코쳇 로봇 (2) | 2024.12.15 |
[lv2] 줄 서는 방법 (1) | 2024.12.15 |
[lv2] 배달 (0) | 2024.12.13 |
[lv2] 시소 짝꿍 (0) | 2024.12.12 |