카카오코테 - [3차]방금 그곡

greenTea·2023년 9월 10일
0

코드

class Solution {
    public String solution(String m, String[] musicinfos) {
        
        Queue<Node> queue = new PriorityQueue<>(Comparator.comparing((Node node) -> node.len,Comparator.reverseOrder())
                .thenComparing(node -> node.start)
                .thenComparing(node -> node.index));

        m = change(m);
        
        for (int i=0;i<musicinfos.length;i++) {
            String[] music = musicinfos[i].split(",");
            music[3] = change(music[3]);
            int re = timeLogic(music[0],music[1]);
            if (repeatStr(music[3],re,m)) {
                queue.offer(new Node(re,music[0],i,music[2]));
            }

        }
        return queue.isEmpty() ? "(None)" : queue.poll().musicName;
    }
    
    private String change(String strs) {
        return strs.replace("C#","J")
                .replace("D#","k")
                .replace("F#","L")
                .replace("G#","N")
                .replace("A#","M");
    }
    
    private  int timeLogic(String t1, String t2) {
        String[] time1 = t1.split(":");
        String[] time2 = t2.split(":");

        return (Integer.parseInt(time2[0]) - Integer.parseInt(time1[0]) )*60 +
                Integer.parseInt(time2[1]) - Integer.parseInt(time1[1]);
    }

    private  boolean repeatStr(String str,int num,String m) {
       return (str.repeat(num /str.length()) + str.substring(0,num % str.length())).contains(m);
    }

    static class Node {
        int len;
        String start;
        int index;
        String musicName;

        public Node(int len, String start, int index,String musicName) {
            this.len = len;
            this.start = start;
            this.index = index;
            this.musicName = musicName;
        }
    }
}

풀이

  1. Queue를 선언해 줍니다.(Qeueu를 선언하지 않고 그때그때 마다 비교해서 푸셔도 됩니다.)
    우선순위큐를 생성하는데 이 대 Comparator.comparing을 통해 문제의 조건들을 넣어줍니다.
  2. 문제에서는 C#,D#등 #이 들어가 있는데 문제의 편의를 위해 위 값들을 편한 값으로 replace 해줍니다. (J,K...)
  3. musicInfo","를 기준으로 분리해줍니다. 이 후 해당 값의 진행 시간을 계산 해주는데 저는 단순하게 (시*60 + 분)으로 계산하여서 둘의 차이를 구하였습니다.
  4. 위에서 구한 값을 통해 어떠한 음악이 진행되었는지를 구합니다.(str.repeat(num /str.length())의 경우 해당 값이 곡 길이보다 긴 경우에는 해당 횟수 만큼 반복해서 넣어줍니다. str.substring(0,num % str.length())를 통해 나머지 값(중간에 잘린 값)들을 더해줍니다. 이 값을 contains(m)을 이용하여 m의 값이 들어있는지를 반환해줍니다.
  5. if문을 통과할 경우 queue에 넣어줍니다. 저는 Node라는 class를 만들어서 진행하였습니다.
  6. queue가 비어있다면 "None"을 반환하고 그렇지 않다면 첫 번째 값을 반환해줍니다.

🤔위 repeatStr() 로직과 change() 로직의 아이디어를 생각해내셨다면 비교적 쉽게 푸실수 있었을 겁니다. 저의 경우 change()를 생각못해서 시간이 걸렸습니다.😭

출처 : 프로그래머스 - [3차 방금그곡]

profile
greenTea입니다.

0개의 댓글