⚠️ 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");
}
}
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[ 프로그래머스 ] #42584 : 주식가격 - JAVA (1) | 2025.02.05 |
---|---|
[ 프로그래머스 ] #17684 : [3차] 압축 - JAVA (0) | 2025.02.05 |
[ 프로그래머스 ] #17680 : [1차] 캐시 - JAVA (1) | 2025.01.21 |
[ 프로그래머스 ] #17679 : [1차] 프렌즈4블록 - JAVA (0) | 2025.01.21 |
[ 프로그래머스 ] #42889 : 실패율 - JAVA (0) | 2025.01.16 |