하루에 한 문제

[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 방금그곡 -Java 본문

알고리즘/프로그래머스 lv2 다시풀기

[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 방금그곡 -Java

dkwjdi 2021. 3. 16. 02:23

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

 

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

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

programmers.co.kr

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으로 잘라서 붙여줍니다!

 

끝~

Comments