[Programmers]-[3차] 방금그곡

문제

문제

코드

import java.util.*;

class Solution {
    public String solution(String m, String[] musicinfos) {
        String answer = "";
        int playTime = 0;//재생된 길이
        String playedCode;//재생된 코드
        
        ArrayList<String> correctMusic = new ArrayList<String>();
        HashMap<String,Integer> correctMap = new HashMap<String,Integer>();
        
        String[][] list = new String[musicinfos.length][4];
        
        m += " ";
        String musicName = "";
        for(int j=0;j<m.length()-1;j++){//#구분하기위해 띄어쓰기로 구분
            musicName += m.charAt(j);
            if(m.charAt(j+1)=='#'){
                musicName += "#";
                j++;
            }
            musicName += " ";
        }
        
        for(int i=0;i<musicinfos.length;i++){
            list[i] = musicinfos[i].split(",");//분할해 넣기
            playedCode = "";
            
            int startHour = Integer.parseInt(list[i][0].substring(0,2));
            int endHour = Integer.parseInt(list[i][1].substring(0,2));
            int startMinute = Integer.parseInt(list[i][0].substring(3,5));
            int endMinute = Integer.parseInt(list[i][1].substring(3,5));
            
            playTime = 60*(endHour-startHour)+(endMinute-startMinute);
            //재생시간 공식
            
            int count = 0;//실제 재생된 코드 길이 세기
            int count_s = 0;//실제 재생된 코드 #개수 세기
            
            while(count != playTime){//음악 코드를 순차적으로 재생된코드에 넣기
                
                playedCode += list[i][3].charAt((count+count_s)%list[i][3].length());
                count++;
                
                if(list[i][3].charAt(((count+count_s)%list[i][3].length()))=='#'){//#이 나올경우
                    playedCode += "#";
                    count_s++;
                }
                playedCode += " ";
            }
            
            if(playedCode.contains(musicName)){//재생된 코드에 포함될 경우
                correctMusic.add(list[i][2]);
                correctMap.put(list[i][2], playTime);
            }
        }
        int max = 0;
        for(String key : correctMap.keySet()){//최대재생길이 찾기
            if(max < correctMap.get(key))
                max = correctMap.get(key);
        }
        
        int correctCount = 0;
        for(String key : correctMap.keySet()){//최대재생길이 여러개 인지
            if(max == correctMap.get(key)){
                correctCount++;//이 수로 구분
                answer = key;
            }
        }
        
        if(correctCount > 1) return correctMusic.get(0);//여러개이면
        else if(correctCount == 1) return answer;//하나이면
        else return "(None)";//없으면
    }
}

코드 설명

ArrayList에는 이름만 넣음.

HashMap은 이름과 재생시간을 넣음.

m값의 #을 띄어쓰기로 구분해 musicName에 재배열한다.

구분하기 편하게 list에 깔끔히 나눠준다.

playedCode에 (현재count수)%길이로 담는다. 그러면 길이를 넘어도 나머지값이된다.

count_s는 #의 갯수이다.

playedCode완성후 musicName과 비교한다.

마지막 if구문을 안해주면 분명 오류가 난다.

요약

  • s.contains()로 포함 유무를 알 수있다.
  • for(String key : map.keySet()) 으로 키, 값 알기.
  • iterator도 알아두면 좋다.