본문 바로가기
Memo/코테

방금 그 곡

by 연로그 2020. 12. 29.
반응형
  • 방금그곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.
  • 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
  • 각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.
  • 음악이 00:00를 넘겨서까지 재생되는 일은 없다.
  • 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
  • 조건이 일치하는 음악이 없을 때에는 `(None)`을 반환한다.

입력 형식

입력으로 네오가 기억한 멜로디를 담은 문자열 m과 방송된 곡의 정보를 담고 있는 배열 musicinfos가 주어진다.

  • m은 음 1개 이상 1439개 이하로 구성되어 있다.
  • musicinfos는 100개 이하의 곡 정보를 담고 있는 배열로, 각각의 곡 정보는 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보가 ','로 구분된 문자열이다.
    • 음악의 시작 시각과 끝난 시각은 24시간 HH:MM 형식이다.
    • 음악 제목은 ',' 이외의 출력 가능한 문자로 표현된 길이 1 이상 64 이하의 문자열이다.
    • 악보 정보는 음 1개 이상 1439개 이하로 구성되어 있다.

출력 형식

조건과 일치하는 음악 제목을 출력한다.

m musicians answer
ABCDEFG [12:00,12:14,HELLO,CDEFGAB, 13:00,13:05,WORLD,ABCDEF] HELLO
CC#BCC#BCC#BCC#B [03:00,03:30,FOO,CC#B, 04:00,04:08,BAR,CC#BCC#BCC#B] FOO
ABC [12:00,12:14,HELLO,C#DEFGAB, 13:00,13:05,WORLD,ABCDEF] WORLD

 


내 코드

import java.util.*;
class Solution {
    public String solution(String m, String[] musicinfos) {
        String answer = "";
        int answerPlayTime = 0;
        m = changeShop(m);
        for(String musicinfo:musicinfos) {
            String[] arr = musicinfo.split(",");
            
            int playTime = calPlayTime(arr[0],arr[1]);
            if(playTime<=answerPlayTime) continue;  // playTime이 짧다면 나머지는 계산할 필요 x
            
            arr[3] = changeShop(arr[3]);
            String music = "";
            for(int i=0;i<playTime;i++) {
                music += Character.toString(arr[3].charAt(i%arr[3].length()));
            }
            
            if( music.indexOf(m)>-1 ) {
                answer=arr[2];
                answerPlayTime = playTime;
            }
        }
        if("".equals(answer)) return "(None)";
        return answer;
    }
    
    public String changeShop(String str) {
        return str.replaceAll("A#","a").replaceAll("C#","c").replaceAll("D#","d")
            .replaceAll("F#","f").replaceAll("G#","g");
    }
    
    public int calPlayTime(String t1, String t2) {
        int[] time1 = Arrays.stream(t1.split(":")).mapToInt(Integer::parseInt).toArray();
        int[] time2 = Arrays.stream(t2.split(":")).mapToInt(Integer::parseInt).toArray();
        
        if(time2[1]-time1[1]<0) {
            time2[0]--; time2[1]+=60;
        } 
        return (time2[0]-time1[0])*60+time2[1]-time1[1];
    }
}

1. #이 붙은 코드는 소문자로 치환

2. 배열을 돌며 해당 곡마다 연주하는 음악을 찾고, m이 포함되는 것을 저장

 

- changeShop: # 붙은 코드 치환

- calPlayTime: 문자열 2개를 받아 몇 분 동안 진행됐는지 계산

 


다른 사람 코드 참고사항

- 시간 계산하는 부분

int start = (60 * Integer.parseInt(info[0].substring(0, 2)) + Integer.parseInt(info[0].substring(3)));
int end = (60 * Integer.parseInt(info[1].substring(0, 2)) + Integer.parseInt(info[1].substring(3)));
int t = end - start;

나는 시 따로 분 따로 계산했는데 이렇게 더해버리는 편이 훨씬 간편할 것 같다

 

 

반응형

'Memo > 코테' 카테고리의 다른 글

[Codility] TapeEquilibrium  (0) 2021.04.21
[Codility] PermMissingElem  (0) 2021.04.20
정수 삼각형  (0) 2021.01.18
짝지어 제거하기  (0) 2021.01.11
튜플  (0) 2021.01.11