프로그래머스 - (Java) 방금 그곡
알고리즘/프로그래머스

프로그래머스 - (Java) 방금 그곡

https://programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

1. 유형

문자열

 

2. 로직

  1. musicinfos를 파싱해야한다
    1. 시작시간, 끝난시간, 곡이름, 악보 순서로 배열을 만든다
  2. 플레이 시간 만큼 악보 늘리기
  3. m이 악보에 포함되는지 슬라이딩 윈도우로 판단
    1. 나중에 굳이 슬라이딩 윈도우 말고, String에 contains라이브러리가 있었음
  4. 정답을 리스트에 넣고 기준에 따라 정렬

 

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)