프로그래머스 (카카오) | LV.2 [3차] 방금그곡 - 구현 문풀 (Java)

728x90

⬛ 프로그래머스 (카카오) | LV.2 [3차] 방금그곡 - 구현 문풀 (Java)

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

 

프로그래머스

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

programmers.co.kr

문제 설명


💚문제 접근 방식

1) 일단 ‘#’ 에 대해서는 replace로 치환 처리를 해주어야 한다.

2) for문으로 musicinfos를 순회하면서

→ 매번 재생시간 time을 구하고

→ 해당 name과 melodyInfo를 #치환해서 들고 있는다.

이제 이 상황에서 재생시간이 음악길이보다 더 길다면 melody 정보를 반복된 횟수와 남은 멜로디까지 이어붙인 fullMelody 정보로 세팅해준다.

이유는 melodyInfo에 m이 담겨있는 것으로 해당 음악을 재생한것인지 판별하기 위함이다.

3) 이후 time이 가장 긴 음악의 name을 갱신하다가 리턴해주면 된다. 없으면 None리턴


1차 제출 코드 | 예제 통과 최종 실패

나 같은 경우에는 info로 들어온 멜로디의 순서를 m처럼 동일 구조를 만들어주려고 헀다.. 근데 이게 뭔가 잘 안됐다.

결국 풀이를 보긴 했는데, 풀이에서는 재생 길이와 음악 길이를 비교해서 full 멜로디를 완성한뒤 contains로 확인하는 과정을 거쳤다. 내가 기존에 하던 방식에는 먼가 예외로 안되는 게 있나보다 ㅠㅠ 

import java.util.*;
class Info implements Comparable<Info>{
    int time;
    String name;
    Info(int time, String name){
        this.time= time;
        this.name =name;
    }
    public int compareTo(Info o){
        return o.time - this.time;
    }
}
class Solution {
    static int getTime(String str){
        int H = Integer.parseInt(str.split(":")[0]);
        int M = Integer.parseInt(str.split(":")[1]);
        
        return 60 * H + M;//분
    }
    
    static boolean equalsString(String a, String b){ //b는 항상 
        String tmp = "";
        
        if(a.charAt(0) != b.charAt(0)){
            int ed = b.indexOf(a.charAt(0));//그 시작 ed를 찾기 
            tmp = b.substring(ed);
            tmp += b.substring(0, ed);
            b = tmp;
        }
        
        if(a.equals(b) || a.contains(b) || b.contains(a)) return true;
        
        return false;
    }
    
    //솔루션 함수 
    public String solution(String m, String[] musicinfos) {
        String answer ="(None)";
        
        m = m.replaceAll("A#", "1")
            .replaceAll("C#", "2")
            .replaceAll("D#", "3")
            .replaceAll("G#", "4")
            .replaceAll("F#", "5");
        
        PriorityQueue<Info> pQ=  new PriorityQueue<>();
        
        for(String x : musicinfos){
            String[] tmp = x.split(",");
            
            int st = getTime(tmp[0]);
            int ed = getTime(tmp[1]);
            int time = ed - st;
            
            String name = tmp[2];
            String melody = tmp[3];
            
            melody = melody.replaceAll("A#", "1")
                .replaceAll("C#", "2")
                .replaceAll("D#", "3")
                .replaceAll("G#", "4")
                .replaceAll("F#", "5");
          
            boolean flag = equalsString(m, melody);
            if(flag) pQ.offer(new Info(time, name));
        }
        
        if(!pQ.isEmpty()) answer = pQ.poll().name;
        
        return answer;
    }
}

 

💚 제출 코드 | 34번 케이스 통과를 위해서는 B# 도 추가해야 됨

  • 계속 문제가 34번만 틀렸다고 되어 있어서 이유를 몰랐는데 ..
  • 문제에서는 B#에 대한 음 이야기가 없다.. 그런데 B#에 대한 테스트케이스가 34번에 들어갔다고 한다. ^___^  

[참고 링크] https://school.programmers.co.kr/questions/72411

 

프로그래머스

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

programmers.co.kr

  • 암튼 이거까지 추가하니까 돌아갔다 … 
import java.util.*;

class Solution {
    static int getTime(String str){
        int H = Integer.parseInt(str.split(":")[0]);
        int M = Integer.parseInt(str.split(":")[1]);
        
        return 60 * H + M;//분
    }
    
    static String changeMelody(String oldMelody) {
        oldMelody = oldMelody.replaceAll("C#", "H")
            .replaceAll("D#", "I").replaceAll("F#", "J").replaceAll("G#", "K")
            .replaceAll("A#", "L").replaceAll("B#", "M"); // 문제에 없는 B# 코드 추가해야 [34]통과
        
        return oldMelody;
    }
    //솔루션 함수 
    public String solution(String m, String[] musicinfos) {
        String answer ="(None)";
        int maxPlayTime = -1;
        m = changeMelody(m);

        for(String x : musicinfos){
            String[] tmp = x.split(",");
            
            int st = getTime(tmp[0]);
            int ed = getTime(tmp[1]);
            int time = ed - st;
            
            String name = tmp[2];
            String melodyInfo = changeMelody(tmp[3]);
          
            //재생 시간 > 음악 길이
            if(time > melodyInfo.length()){
                StringBuilder newMel = new StringBuilder();
                for(int i=0; i<time / melodyInfo.length() ;i++){
                    newMel.append(melodyInfo);
                }
                
                //나머지 만큼 악보에서 잘라 붙임
                newMel.append(melodyInfo.substring(0, time % melodyInfo.length()));
                melodyInfo = newMel.toString();
            }else{
                melodyInfo= melodyInfo.substring(0, time);
            }
        
            if(melodyInfo.contains(m) && time > maxPlayTime){
                answer = name;
                maxPlayTime = time;
            }
        }   
        
        return maxPlayTime != -1 ? answer : "(None)";
    }
}
728x90