유블로그

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

알고리즘

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

yujeong kang 2021. 2. 1. 00:20

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

 

제발..

10,19,30 

이 3개가 자꾸 틀린다

알 수가 없다 진짜

 

계속 보면서 오류를 찾기 위해서,,, 기록

 

처음엔 아래 코드로 했다가

package programmers.level2;

public class 방금그곡_1시간24분 {	// 1시간 24분째 3개 틀리는 중
	public String solution(String m, String[] musicinfos) {
		if(musicinfos.length == 0) return "(None)";
		
        String answer = "";
        int MAX = 0;
        for (int i = 0; i < musicinfos.length; i++) {
        	String[] info = musicinfos[i].split(",");
        	String[] t1 = info[0].split(":");
        	String[] t2 = info[1].split(":");
        	int len;
        	if(t1[0].equals(t2[0])) {
        		len = Integer.parseInt(t2[1]) - Integer.parseInt(t1[1]); 
        	}
        	else {
        		len = 60 - Integer.parseInt(t1[1]) + Integer.parseInt(t2[1]); 
        	}
        	
			StringBuilder sb = new StringBuilder();
			int idx = 0;
			for (int t = 0; t < len; t++) {
				if(idx == info[3].length()) idx = 0;
				sb.append(info[3].charAt(idx++));
				if(idx < info[3].length() && info[3].charAt(idx) == '#') {
					sb.append(info[3].charAt(idx++));
				}
			}
			
			String music = sb.toString();
			for (int j = 0; j < music.length(); j++) {
				if(m.length() > music.length()-j) break;
				idx = 0;
				if(m.charAt(idx) == music.charAt(j)) {
					boolean success = true;
					for (int j2 = j+1; j2 < music.length(); j2++) {
						idx++;
						if(idx == m.length()) {
							if(j2 < music.length() && music.charAt(j2) == '#')
								success = false;
							break;
						}
						if(m.charAt(idx) != music.charAt(j2)) {
							success = false;
							break;
						}
					}
					if(success) {
						if(MAX < len) {
							answer = info[2];
							MAX = len;
						}
					}
				}
			}
		}
        
        if(answer.length() == 0) {
        	return "(None)";
        }
        return answer;
	}
}

 

3개가 계속 틀리길래

#을 치환하는 방식으로 바꿔서 새로 짰다.

C#, A#... 이런 것들 처리를 위해 아예 다른문자로 바꾸고

했는데

이상하게 이 코드도 10,19,30 번만 틀린다....

내가 놓치고 있는 게 있는 걸까 알 수가 없다..........

class Solution {
	public String solution(String m, String[] musicinfos) {	// 36분
		if(musicinfos.length == 0) return "(None)";
			
		m = change(m);
        String answer = "";
        int MAX = 0;
        for (int i = 0; i < musicinfos.length; i++) {
        	String[] info = musicinfos[i].split(",");
        	String[] t1 = info[0].split(":");
        	String[] t2 = info[1].split(":");
        	int len;
        	if(t1[0].equals(t2[0])) {
        		len = Integer.parseInt(t2[1]) - Integer.parseInt(t1[1]); 
        	}
        	else {
        		len = 60 - Integer.parseInt(t1[1]) + Integer.parseInt(t2[1]); 
        	}
        	
        	info[3] = change(info[3]);

        	StringBuilder sb = new StringBuilder();
			int idx = 0;
			for (int t = 0; t < len; t++) {
				if(idx == info[3].length()) idx = 0;
				sb.append(info[3].charAt(idx++));
			}
			
			String music = sb.toString();
			if(music.contains(m)) {
				if(MAX < len) {
					answer = info[2];
					MAX = len;
				}
			}
		}
        
        if(answer.length() == 0) {
        	return "(None)";
        }
        return answer;
	}
	
	public String change(String str) {
		StringBuilder sb = new StringBuilder();
    	for (int j = 0; j < str.length(); j++) {
			switch(str.charAt(j)) {
			case 'C':
				if(j+1 < str.length() && str.charAt(j+1) == '#') sb.append('B');
				else sb.append('A');
				break;
			case 'D':
				if(j+1 < str.length() && str.charAt(j+1) == '#') sb.append('D');
				else sb.append('C');
				break;
			case 'E':
				sb.append('E');
				break;
			case 'F':
				if(j+1 < str.length() && str.charAt(j+1) == '#') sb.append('G');
				else sb.append('F');
				break;
			case 'G':
				if(j+1 < str.length() && str.charAt(j+1) == '#') sb.append('I');
				else sb.append('H');
				break;
			case 'A':
				if(j+1 < str.length() && str.charAt(j+1) == '#') sb.append('K');
				else sb.append('J');
				break;
			case 'B':
				sb.append('L');
				break;
			}
		}
    	return sb.toString();
	}
}

 

 

성공..

시간 때문에 틀린 거였다..

좀 어이없다

시간계산이 이상해서 좀 의문

class Solution {
	public String solution(String m, String[] musicinfos) {
		if(musicinfos.length == 0) return "(None)";
		
		m = m.replace("C#", "c").replace("D#", "d").replace("E#", "e").replace("F#", "f").replace("G#","g").replace("A#","a");
        String answer = "";
        int MAX = 0;
        for (int i = 0; i < musicinfos.length; i++) {
        	String[] info = musicinfos[i].split(",");
        	String[] t1 = info[0].split(":");
        	String[] t2 = info[1].split(":");
        	int len;
        	if(t1[0].equals(t2[0])) {
        		len = Integer.parseInt(t2[1]) - Integer.parseInt(t1[1]); 
        	}
        	else {
        		len = 0;
        		len += 60 * (Integer.parseInt(t2[0]) - Integer.parseInt(t1[0])); 
    			len += Integer.parseInt(t2[1]) - Integer.parseInt(t1[1]);
        	}
        	
        	info[3] = info[3].replace("C#", "c").replace("D#", "d").replace("E#", "e").replace("F#", "f").replace("G#","g").replace("A#","a");

        	StringBuilder sb = new StringBuilder();
			int idx = 0;
			for (int t = 0; t < len; t++) {
				if(idx == info[3].length()) idx = 0;
				sb.append(info[3].charAt(idx++));
			}
			
			String music = sb.toString();
			if(music.contains(m)) {
				if(MAX < len) {
					answer = info[2];
					MAX = len;
				}
			}
		}
        
        if(answer.length() == 0) {
        	return "(None)";
        }
        
        return answer;
	}
}