어제의 나보다 성장한 오늘의 나

[프로그래머스][Level2][Java] 방금그곡 본문

알고리즘/프로그래머스(Programmers)

[프로그래머스][Level2][Java] 방금그곡

NineOne 2020. 12. 16. 23:50

programmers.co.kr/learn/courses/30/lessons/42587programmers.co.kr/learn/courses/30/lessons/17683

 

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

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

programmers.co.kr

문제풀이

  1. split을 통해 musicinfos에 저장된 정보들이 ","로 구분되어 있기에 나눠주었다.
  2. 시간 같은 경우는 일일히 더하고 곱하고 하기 힘들어서 SimpleDateFormat함수를 사용하였다.
  3. musicinfos[i][0]과 musicinfos[i][1]의 차이가 재생시간 임으로 getTime() 내부함수를 통해 재생시간을 구했다.
  4. 제한사항에 명시되어 있는 "음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복된다"를
    통해 for문으로 재생시간만큼 새로운 멜로디를 만들었다.
  5. list(조건에 맞기 정렬)에 저장된 음악들을 하나하나 contain함수를 통해 존재하면 해당 음악 제목을 리턴하였다. 
  6. change함수 같은 경우는 "C#" 같이 문자열 길이를 2칸 차지하여 '4번 사항'에 에러가 있어 임의로 바꿔 줬다.

코드

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

class Solution {
    public String solution(String m, String[] musicinfos) throws ParseException {
        String answer = "(None)";
        List<Data> list = new ArrayList<>();
        
        for(int i=0; i<musicinfos.length; i++) {
        	String[] info = musicinfos[i].split(",");
        	Date startDate = new SimpleDateFormat("HH:mm").parse(info[0]);
            Date startDate2 = new SimpleDateFormat("HH:mm").parse(info[1]);
            int time = (int) ((startDate2.getTime() - startDate.getTime()) / 60000);
            
            String ch = change(info[3]);
            
            String newMelody = "";
            
            for(int j=0; j<time; j++) {
            	newMelody += ch.charAt(j%ch.length());
            }
            
            System.out.println(newMelody);
            list.add(new Data(i,time, info[2], newMelody));
        }
        
        Collections.sort(list);
        //찾기
        m = change(m);
        for(int i=0; i<list.size(); i++) {
        	Data data = list.get(i);
        	if(data.melody.contains(m)) return data.title;
        }

        return answer;
    }
	
    //변환
	private String change(String str) {
		str = str.replace("C#", "1");
		str = str.replace("D#", "2");
		str = str.replace("F#", "3");
		str = str.replace("G#", "4");
		str = str.replace("A#", "5");
		
		return str;
	}

	static class Data implements Comparable<Data>{
		int index;
		int time;
		String title;
		String melody;
		public Data(int index, int time, String title, String melody) {
			this.index = index;
			this.time = time;
			this.title = title;
			this.melody = melody;
		}
		
		@Override
		public int compareTo(Data o) {
			if(this.time == o.time) return this.index - o.index;
			return (this.time - o.time)*-1;
		}
	}
}
Comments