https://programmers.co.kr/learn/courses/30/lessons/17683
1. 유형
문자열
2. 로직
- musicinfos를 파싱해야한다
- 시작시간, 끝난시간, 곡이름, 악보 순서로 배열을 만든다
- 플레이 시간 만큼 악보 늘리기
- m이 악보에 포함되는지 슬라이딩 윈도우로 판단
- 나중에 굳이 슬라이딩 윈도우 말고, String에 contains라이브러리가 있었음
- 정답을 리스트에 넣고 기준에 따라 정렬
3. 풀이
문자열 파싱을 끝낸후, 위 처럼 m과 악보가 일치하는 부분을 찾아야한다.
이때, 슬라이딩 윈도우를 쓴다. 하지만 굳이 구현할 필요 없이, 라이브러리를 써도 된다.
위처럼 간단하게 코드를 줄일 수 있다.
- 정렬
정답을 재생시간 내림차순, 입력순서 오름차순으로 정렬하는 코드
4. 코드
import java.util.*;
class Solution {
static String[] sharp = {"C#", "D#", "E#", "F#", "G#", "A#"};
static String[] lowercase = {"c", "d", "e", "f", "g", "a"};
public String solution(String m, String[] musicinfos) {
String answer = "(None)";
m = parsing(m);
ArrayList<String[]> lists = new ArrayList<>();
int idx =0;
for(String musicinfo: musicinfos){
String infos[] = musicinfo.split(",");
infos[3] = parsing(infos[3]);
int start = getTime(infos[0].split(":"));
int end = getTime(infos[1].split(":"));
int totaltime = end - start;
String totalstr = check(totaltime, infos[3]);
// if(totalstr.contains(m)){
// lists.add(new String[]{String.valueOf(totaltime), infos[2], String.valueOf(idx++)});
// }
if(findstr(totalstr, m)){
lists.add(new String[]{String.valueOf(totaltime), infos[2], String.valueOf(idx++)});
}
}
if(lists.size()!=0){
Collections.sort(lists, new Comparator<String[]>(){
public int compare(String o1[], String o2[]){
if(stoi(o1[0])==stoi(o2[0])){
return stoi(o1[2])- stoi(o2[2]);
}
return -(stoi(o1[0])-stoi(o2[0]));
}
});
answer = lists.get(0)[1];
}
return answer;
}
static int stoi(String s){
return Integer.valueOf(s);
}
static String parsing(String m){
for(int i=0; i<sharp.length; i++){
m = m.replace(sharp[i], lowercase[i]);
}
return m;
}
static boolean findstr(String totalstr, String m){
int start = 0;
for(int end=m.length(); end<=totalstr.length(); end++){
String temp = totalstr.substring(start, end);
start++;
if(temp.equals(m)){
return true;
}
}
return false;
}
static int getTime(String time[]){
int hour =Integer.valueOf(time[0])*60;
int min = Integer.valueOf(time[1]);
return hour+min;
}
static String check(int totaltime, String str){
int size = str.length();
int mok = totaltime/size;
int na = totaltime%size;
String res = "";
for(int i=0; i<mok; i++)
res += str;
res+=str.substring(0, na);
return res;
}
}
/*
시간을 초로 바꾸고 지속시간을 안다
을을 갯수만큼 이어준다
for info range(musicinfos)
슬라이딩 윈도우로 info와 같은지 여부를 판단
def check(totaltime, str)
*/
- 알게된점
String클래스의 contains()
기준.contains(비교할string)
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - (Java) 괄호 회전하기 (0) | 2021.06.06 |
---|---|
프로그래머스 - (Java) 프렌즈4블록 (0) | 2021.06.06 |
프로그래머스 - 베스트앨범 (0) | 2021.05.26 |
프로그래머스 - 가장 먼 노드 (0) | 2021.05.25 |
프로그래머스 - 기지국 설치 (0) | 2021.05.24 |