[ 프로그래머스 ] #17683 : [3차] 방금그곡 - JAVA

🔗 [3차] 방금그곡

⚠️ m이 "ABC" , 악보가 "ABC#" 일때 단순히 contains를 사용하면 같은 음으로 간주하게 되지만 다른 음임을 주의

➡️ 따라서 A#,B#,C#,D#,E#,F#,G#을 다른 문자로 바꾸는 과정 필요

import java.util.*;
class Solution {
    public String solution(String m, String[] musicinfos) {
        // m : 네오가 기억한 멜로디
        // musicinfos : [음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보]


        // 음악이 여러 개라면 재생 시간이 긴 음악
        // 재생 시간도 같을 경우 먼저 입력된 음악

        m=convertSharp(m);// #변환
        int maxTime=0;//가장 긴 시간
        String resultTitle="(None)";//반환값

        for(String musicinfo:musicinfos){
            String []arr=musicinfo.split(",");
            String title=arr[2];//음악 제목
            String info=convertSharp(arr[3]);// #변환한 악보
            int playTime=convertToTime(arr[0],arr[1]);//재생 시간

            //찾으려는 음악일 경우
            if(check(info,playTime,m) && playTime>maxTime){
                maxTime=playTime;
                resultTitle=title;
            }
        }
        return resultTitle;
    }

    //재생 시간을 분으로 변환
    private int convertToTime(String start, String end){
        int startHour=Integer.parseInt(start.split(":")[0]);
        int endHour=Integer.parseInt(end.split(":")[0]);

        int startMinute=Integer.parseInt(start.split(":")[1]);
        int endMinute=Integer.parseInt(end.split(":")[1]);

        return (endHour*60+endMinute)-(startHour*60+startMinute);

    }


    // 조건에 맞는 음악인지 체크
    private boolean check(String info, int playTime,String m){

        String str="";

        // 재생시간 만큼의 악보정보
        for(int i=0;i<playTime;i++){

            //반복 재생 고려하기 위해 모듈러 연산
            char c=info.charAt(i%info.length());//음 하나
            str+=c;
        }
        return str.contains(m);
    }

    // #은 소문자로 변환
    private String convertSharp(String str){
        return str.replace("A#", "a")
            .replace("B#", "b")
            .replace("C#", "c")
            .replace("D#", "d")
            .replace("E#", "e")
            .replace("F#", "f")
            .replace("G#", "g");
    }

}