티스토리 뷰

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

 

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

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

programmers.co.kr

 

풀이과정

1. 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보로 분리하기 -> ',' 구분자로 분리

2. 재생 시간 구하기

3. C#, D# 등 코드 소문자 알파벳으로 바꾸기 -> 함수로 작성 (replace_code())

3-1. 악보 정보 바꾸기 -> replace_code(악보 정보)

3-2. 네오가 기억한 멜로디(m) 바꾸기 -> replace_code(네오가 기억한 멜로디)

4. 재생 시간만큼의 코드 구하기

5. 네오가 기억한 멜로디(m)가 구한 코드에 포함되는지 확인

5-1. Python 풀이의 경우)

     - 포함되면 새로운 배열에 제목과 시간을 저장

     - 배열의 길이가 1이면 첫번째 인덱스의 제목 리턴

     - 배열의 길이가 0이면 (None) 리턴

     - 배열의 길이가 2 이상이면 재생 시간 순으로 정렬하고 첫번째 인덱스의 제목 리턴 (먼저 입력되는 순서대로 저장됐기 때문에 재생 시간 순으로만 정렬해도 상관없음)

 

5-2. Java 풀이의 경우)

      - 최대 재생 시간 비교를 위한 변수 필요 -> max

      - 포함되고 max보다 더 크면 answer 갱신

      - 최종 answer이 빈 문자열이면 (None) 리턴

코드

1. Python

def solution(m, musicinfos):
    answer = ''
    result = []
    
    for musicinfo in musicinfos:
        info = musicinfo.split(',')
        start = info[0].split(':')
        end = info[1].split(':')
        
        time = (int(end[0]) - int(start[0])) * 60 + int(end[1]) - int(start[1])

        code = replace_code(info[3])
        code = code * (time // len(code)) + code[:time%len(code)]
        
        if replace_code(m) in code:
            result.append([info[2], time])

    if len(result) == 0:
        return "(None)"
    
    else:
        result = sorted(result, key = lambda x: (-x[1]))
        return result[0][0]
    
def replace_code(code):
    code = code.replace('C#', 'c')
    code = code.replace('D#', 'd')
    code = code.replace('F#', 'f')
    code = code.replace('G#', 'g')
    code = code.replace('A#', 'a')
    
    return code

 

2. Java

class Solution {
    public String solution(String m, String[] musicinfos) {
        String answer = "";
        int max = 0;
            
        for (String musicinfo: musicinfos) {
            String[] info = musicinfo.split(",");
        
            String[] start = info[0].split(":");
            String[] end = info[1].split(":");
            int time = (Integer.parseInt(end[0]) - Integer.parseInt(start[0])) * 60 + Integer.parseInt(end[1]) - Integer.parseInt(start[1]);
            
            String replaced_code = replace_code(info[3]);
            String code = "";
            
            for (int i = 0; i < time / replaced_code.length(); i++)
                code += replaced_code;
            
            code += replaced_code.substring(0, time % replaced_code.length());
            
            if (code.contains(replace_code(m))) {
                if (max < time) {
                    max = time;
                    answer = info[2];
                }
            }
        }
        
        if (answer == "")
            answer = "(None)";
        
        return answer;
    }
    
    public String replace_code(String code) {
        code = code.replaceAll("C#", "c");
        code = code.replaceAll("D#", "d");
        code = code.replaceAll("F#", "f");
        code = code.replaceAll("G#", "g");
        code = code.replaceAll("A#", "a");

        return code;
    }
}

 

공지사항
최근에 올라온 글
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함