본문 바로가기
Problem Solving/카카오 블라인드 기출

2018 - [3차] 방금그곡

by Libi 2021. 8. 7.
반응형

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

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

[ 문제풀이 ]

주어진 musicinfos의 악보를 재생된 시간만큼의 길이로 만들어서 기억한 멜로디 m이 존재하는지를 확인하면 되는 간단한 문제이다.

악보의 최대 길이는 00:00 ~ 23:59까지인 1439개밖에 안되기 때문에 모든 문자열을 탐색한다 하여도 시간 초과가 발생하지는 않을 것이다.

하지만 테스트 케이스 3번과 같은 경우를 조심해줘야 한다. HELLO의 악보는 "C#DEFGABC#DEFGAB"이기 때문에 "ABC" 와 "ABC#"처럼 "#"이 있는 경우를 따로 구분해줘야 하기 때문이다.

조건문을 통해 해결할 수 있지만 간단한 방법이 있다. "#"이 붙은 음을 다른 한문자로 치환해주면 된다. 이렇게 되면 따로 예외 처리를 해줄 필요 없이 쉽게 구현해줄 수 있다.

import java.util.*;

class Solution {
    public String solution(String m, String[] musicinfos) {
        String answer = "(None)";
        int maxTime = 0;
        
        m = change(m);
        
        for (String musicinfo : musicinfos) {
            String[] str = musicinfo.split(",");
            int startTime = parseTime(str[0]);
            int endTime = parseTime(str[1]);
            
            int diff = endTime - startTime;
            
            //재생된 현재 최대 시간보다 긴 경우만 확인
            //같은 경우는 먼저 입력된 음악 제목을 반환하기 때문
            if (diff > maxTime) {
                str[3] = change(str[3]);
                
                //재생 시간만큼 문자열을 붙여줌
                StringBuilder sb = new StringBuilder();
                
                int length = str[3].length();
                int a = diff / length;
                for (int i = 0; i < a; ++i) {
                    sb.append(str[3]);
                }
                
                int b = diff % length;
                for (int i = 0; i < b; ++i) {
                    sb.append(str[3].charAt(i));
                }
                
                //멜로디 m을 포함하면 갱신
                if (sb.toString().contains(m)) {
                    maxTime = diff;
                    answer = str[2];
                }
            }
        }
        return answer;
    }
    
    //"#"이 붙은 음을 다른 한 문자로 치환해줌
    public String change(String s) {
        s = s.replaceAll("C#", "c")
        	 .replaceAll("D#", "d")
        	 .replaceAll("F#", "f")
             .replaceAll("G#", "g")
             .replaceAll("A#", "a");
        
        return s;
    }
    
    public int parseTime(String s) {
        String[] time = s.split(":");
        return Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
    }
}

 

 

반응형

'Problem Solving > 카카오 블라인드 기출' 카테고리의 다른 글

2018 - [3차] 자동완성  (0) 2021.08.07
2018 - [3차] 압축  (0) 2021.08.07
2018 - [1차] 다트 게임  (0) 2021.08.07
2018 - [1차] 비밀지도  (0) 2021.08.07
2018 - [1차] 캐시  (0) 2021.08.07

댓글