코딩테스트/Java

(2018카카오) 방금그곡 Java

SK_MOUSE 2021. 3. 18. 09:48
반응형

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

내코드(50점짜리)

더보기

복잡하게 짠 부분이 너무 많다

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

class Solution {
    public String solution(String m, String[] musicinfos) {
        String answer = "";
        int maxCount = 0;
        PriorityQueue<Node> pq = new PriorityQueue<>();
        for (String s : musicinfos) {
            String[] arr = s.split(",");

            SimpleDateFormat format = new SimpleDateFormat("HH:mm");
            int diffMinutes = 0;
            try {
                Date date1 = format.parse(arr[0]);
                Date date2 = format.parse(arr[1]);
                long diff = date2.getTime() - date1.getTime();
                diffMinutes =(int) (diff / (60 * 1000) % 60);
            } catch (ParseException e) {
                e.printStackTrace();
            }

            String[] sum = new String[diffMinutes];
            int circle = 0;
            int go = 0;
            while (go < diffMinutes) {//시간만큼 문자열 생성
                if (circle == arr[3].length()) {//C C # B 계속 가져오는용
                    circle = 0;
                }
                char c = arr[3].charAt(circle++);
                if (c == '#') {
                    sum[go-1] += '#';
                } else sum[go++] = String.valueOf(c);
            }

            int count = 0;//m이 해당 문자열에몇번 들어가는지 체크
            for (int j = 0; j < diffMinutes-m.length(); j++) {
                StringBuilder sb = new StringBuilder();
                for(int summing = j; sb.length()<m.length(); summing++){
                    sb.append(sum[summing]);
                }
                String cut = sb.toString();
                if (cut.equals(m)) {
                    pq.add(new Node(diffMinutes,arr[2]));
                    break;
                }
            }

        }
        if(pq.size()==0) return "(None)";
        else answer = pq.poll().title;

        return answer;
    }
    class Node implements Comparable<Node>{
        int time;
        String title;
        Node(int tm , String tl){
            time=tm;
            title = tl;
        }

        @Override
        public int compareTo(Node o) {
            if(this.time <o.time) return 2;
            else if(this.time >o.time) return -2;
            else{
                if(this.title.length() <o.title.length()) return 1;
                else if(this.title.length() >o.title.length()) return -1;
                else return 0;
            }
        }
    }
}

 

혼자 해결하려고했지만, 스파게티코드처럼 짜서 너무 조잡하게 짜버렸다.

 

* 문제 출제 오류로 27번인가가 통과가 안되는 경우가 있다. 이 테스트 케이스에서 조건에 없던 E#가 등장하기 때문이라고 한다. replaceSharpCord()에 E# -> e 를 추가해주면 된다.

 

모범코드를 참고해보자.taesan94.tistory.com/146#recentEntries

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;	
  }
}

 

 

 

반응형