하루에 한 문제
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 방금그곡 -Java 본문
https://programmers.co.kr/learn/courses/30/lessons/17683
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
class Music implements Comparable<Music>{
String title;
int time;
String info;
public Music(String title, int time, String info) {
this.title = title;
this.time = time;
this.info = info;
}
@Override
public int compareTo(Music o) {
return o.time-this.time;
}
}
public String solution(String m, String[] musicinfos) {
String answer = "";
List<Music> musicList = new ArrayList<>();
m=m.replace("C#", "c").replace("D#", "d").replace("F#", "f").replace("G#", "g").replace("A#", "a");
for(int i=0; i<musicinfos.length; i++) { //시간많은순, 인덱스가 빠른순으로정렬하기 위해 list에 정리해서 삽입
musicinfos[i]=musicinfos[i].replace("C#", "c").replace("D#", "d").replace("F#", "f").replace("G#", "g").replace("A#", "a");
String musicInfo[]=musicinfos[i].split(",");
String startTime[]=musicInfo[0].split(":");
String endTime[]=musicInfo[1].split(":");
int time=(Integer.parseInt(endTime[0])*60+Integer.parseInt(endTime[1]))
-(Integer.parseInt(startTime[0])*60+Integer.parseInt(startTime[1]));
musicList.add(new Music(musicInfo[2],time,musicInfo[3]));
}
Collections.sort(musicList); //오랜시간 재생, 인덱스 빠른순으로 정렬
for(int i=0; i<musicList.size(); i++) { //악보를 시간만큼 늘려주는 작업해서 contain으로 확인하기
Music music=musicList.get(i);
int time=music.time;
String info=music.info;
if(time<=info.length()) { //재생시간보다 악보길이가 더 길면 잘라야됨
music.info=info.substring(0,time);
}
else { //재생시간이 악보길이보다 더 길면 늘려줘야함
int quotient=time/info.length();
int remainder=time%info.length();
for(int j=0; j<quotient; j++) {
music.info+=info;
}
music.info+=info.substring(0,remainder);
}
if(music.info.contains(m)) {
answer=music.title;
break;
}
}
if(answer.equals("")) answer="(None)";
return answer;
}
}
소요시간 : 45분
C#, F#같은 경우는 'c','f' 즉 소문자로 바꿔주었습니다.
1분에 음이 하나씩 재생되기 때문에 한글자로 바꿔주었습니다~
우선 문제에서 조건이 일치하는 음악이 여러개라면
1. 재생된 시간이 가장 긴 음악
2. 1번 조건이 같다면 인덱스가 빠른 음악
처럼 음악의 제목을 반환하라고 했기 때문에
우선 list에 위의 조건을 만족하게 넣어서 정렬을 해줍니다.
재생된 시간이 가장 긴 음악을 찾기 위해서 아래와 같은 방법을 사용했습니다. (시간 * 60) + 분
12 : 00 -> (12*60)+0 =720
14 : 25 -> (14*60)+25 =865
865-720=145
즉 12:00 ~ 14:25 은 145분 차이입니다.
이런식으로 시간을 구해서 리스트에 (제목, 악보, 시간)을 넣고 정렬해주었습니다.
이렇게 정렬을 해서 사용하면 일치하는 악보가 나왔을 때 나머지를 안보고 바로 break를 통해 for문을 끝낼 수 있습니다.
그리고 악보를 늘리거나 줄여줘야 합니다.
1. 재생시간 <= 악보길이
- SubString으로 재생시간만큼 악보를 잘라줍니다.
2. 재생시간 > 악보길이
재생시간 / 악보길이 -> 몫
재생시간 % 악보길이 -> 나머지
악보를 몫-1 만큼 반복해서 만들어줍니다.
그리고 그 악보에 나머지길이만큼 SubString으로 잘라서 붙여줍니다!
끝~
'알고리즘 > 프로그래머스 lv2 다시풀기' 카테고리의 다른 글
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 압축 -Java (0) | 2021.03.16 |
---|---|
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 파일명 정렬 -Java (0) | 2021.03.16 |
[프로그래머스-lv2 2019 KAKAO BLIND RECRUITMENT] 오픈채팅방 -Java (1) | 2021.03.16 |
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 캐시 -Java (0) | 2021.03.15 |
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 프렌즈 4블록 -Java (0) | 2021.03.15 |
Comments