조급하면 모래성이 될뿐

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

Algorithm/Programmers

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

Pawer0223 2020. 4. 9. 16:38

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17683

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드

 

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

class Solution {
  public String solution(String m, String[] musicinfos) throws Exception {

		String answer = "(None)";

		m = m.replaceAll("C#","c");
		m = m.replaceAll("D#","d");
		m = m.replaceAll("F#","f");
		m = m.replaceAll("G#","g");
		m = m.replaceAll("A#","a");
		
		int max = -1 ;
		
		for ( int i = 0;  i < musicinfos.length; i++ ) {

			String[] music = musicinfos[i].split(",");

			SimpleDateFormat f = new SimpleDateFormat("HH:mm", Locale.KOREA);

			Date start = f.parse(music[0]);
			Date end = f.parse(music[1]);
			long diff = end.getTime() - start.getTime() ;
			long minute = diff / (1000*60);

			String musicInfo = music[3];

			musicInfo = musicInfo.replaceAll("C#","c");
			musicInfo = musicInfo.replaceAll("D#","d");
			musicInfo = musicInfo.replaceAll("F#","f");
			musicInfo = musicInfo.replaceAll("G#","g");
			musicInfo = musicInfo.replaceAll("A#","a");

			StringBuilder sb = new StringBuilder();
			boolean contains = false;

			int size = musicInfo.length();

			// 분이 더 짧다면 조금만돌아야한다.
			for ( int j = 0; j < minute; j++ ) {

				// 2번만 붙여도 가능한지 여부를 알 수 있다.
				if ( sb.toString().length() >= m.length()*2 && j >= musicInfo.length()*2 ) break;

				sb.append(musicInfo.charAt(j%size));
				if ( sb.toString().length() >= m.length() && sb.toString().contains(m) ){
					contains=true;
					break;
				}
			}
			
			if ( contains ) {
				// 재생시간이 같은경우 변경하지 않는다.
				if ( max == (int)minute ) continue;
				// 조건이 일치하는 음악이 여러 개일때는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다.
				if ( (int)minute > max ) {
					max = (int)minute;
					answer = music[2];
				}
			}
		}
		return answer;	
  }
}

제출 결과

나의 풀이

1. C#, D#, F#, G#, A#과 같은경우 문자열 처리를 편하게 하기위해 #이 붙은 음은 소문자로 변경해 주었다.

ex) C# -> c , D# -> d

 

2. 주어진 musicInfos에서 시간을 계산하여, 총 몇분동안 음악이 나왔는지 계산.

 

3. 이제 음악이 나온시간만큼 musicinfos의 음을 붙여나간다.

 

4. 붙여나가면서 기억하고 있는 멜로디가 완성되는지를 확인한다.

 

* 주의사항

 

최초 제출 시 22,23,24,29,30번이 계속 실패하였다.

 

22,23,24,29번 테스트 케이스의 경우에는 곡을 찾을 수 없는 경우에 "(None)"을 return하도록 변경하여 조치하였다.

변경 전에는 "'(None)'" 로 ''를 붙여주었기 때문에 실패가 났던것 같다.

 

30번 케이스의 경우에는 최초에 풀이3번째 음을 붙여나가는 반복문의 수행을 분기처리하였다.

 

분기의조건은 기억하고있는 멜로디가, 음악정보의 음에 포함되있는지를 먼저 확인한 후에 포함되어있지않으면 for문을 수행하도록 하였다. ( 시간을 줄이기위해서.. )

 

그런데, 만약 m="CC"인데 "04:00,04:02,ZERO,ACC" 와 같이 주어진경우에는 라디오에 음악이 2분만 나왔기 때문에 사실상 라디오에서는 AC만 흘러나왔고 내가 기억한 CC는 찾을 수 없게된다.

 

이 경우를 고려하여 분기처리를 제거하고 2에서 계산된 minute만큼만 무조건 for문을 수행하도록 조치하였다.

 

 

 

 

 

 

반응형