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

nnm·2020년 4월 19일
0

프로그래머스 방금그곡

문제풀이

굉장히 좋아하는 문제 유형이다. 알고리즘 문제를 푸는 것이 아니라 개발을 하는 느낌이 들어서 좋다. 이 문제의 핵심은 다음과 같다.

  • 입력 데이터 정제하기
    • # 이 붙은 코드는 소문자로 바꿔서 간단하게 만든다. ex) C# -> c
    • 음악의 재생시간은 분 단위로 계산한다. 1분에 코드 하나가 재생되기 때문이다.
    • 음악의 재생시간에 맞게 재생된 코드를 만든다.
  • 정제된 데이터를 재생시간 기준으로 내림차순 정렬한다.
    • 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
  • 일치하는 곡이 없을 때는 (None)를 반환한다. '(None)'가 아니였다.

구현코드

import java.util.*;

class Solution {
	
	String[] sharp = {"C#", "D#", "E#", "F#", "G#", "A#"};
	String[] lowercase = {"c", "d", "e", "f", "g", "a"};
	
	public String solution(String m, String[] musicinfos) {
		String melody = refine(m);
		String[][] infos = refine(musicinfos);
		
		Arrays.sort(infos, new Comparator<String[]>() {
			@Override
			public int compare(String[] music1, String[] music2) {
				int runningTimeOfMusic1 = Integer.parseInt(music1[0]);
				int runningTimeOfMusic2 = Integer.parseInt(music2[0]);
				
				return -(runningTimeOfMusic1 - runningTimeOfMusic2);
			}
		});
		
		for(int i = 0 ; i < infos.length ; ++i) {
			if(infos[i][2].contains(melody)) {
				return infos[i][1];
			}
		}
		
		return "(None)";
	}

	private String refine(String m) {
		String result = m;
		
		for(int i = 0 ; i < sharp.length ; ++i) {
			result = result.replaceAll(sharp[i], lowercase[i]);
		}
		
		return result;
	}
	
	private String[][] refine(String[] musicinfos) {
		String[][] infos = new String[musicinfos.length][3];
		
		for(int i = 0 ; i < musicinfos.length ; ++i) {
			String[] info = musicinfos[i].split(",");
			
			String[] start = info[0].split(":");
			String[] end = info[1].split(":");
			String title = info[2];
			String code = info[3];
			String music = "";
			
			for(int j = 0 ; j < sharp.length ; ++j) {
				code = code.replaceAll(sharp[j], lowercase[j]);
			}
			
			int musicLength = code.length();
			int runningTime = getRunningTime(start, end);
			int codeIdx = 0;
			
			for(int j = 0 ; j < runningTime ; ++j) {
				music += code.charAt(codeIdx);
				codeIdx = (codeIdx + 1) % musicLength;
			}
			
			infos[i][0] = runningTime + "";
			infos[i][1] = title;
			infos[i][2] = music;
		}
		
		return infos;
	}

	private int getRunningTime(String[] start, String[] end) {
		int runningTime = 0;
		
		int startHour = Integer.parseInt(start[0]);
		int startMinute = Integer.parseInt(start[1]);
		int endHour = Integer.parseInt(end[0]);
		int endMinute = Integer.parseInt(end[1]);
		
		runningTime = (endHour - startHour) * 60 + (endMinute - startMinute);
		
		return runningTime;
	}
}
profile
그냥 개발자

0개의 댓글