[프로그래머스] 방금그곡 (JAVA)

개츠비·2023년 5월 21일
0

프로그래머스

목록 보기
16/16
post-custom-banner
  1. 소요시간 : 1시간
  2. 문제 사이트 : 프로그래머스
  3. 문제 수준 : 레벨 2
  4. 다른 사람의 풀이를 참고 했는가 ? : X
  5. 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17683
  6. 푼 날짜 : 2023.05.22

1. 사용한 자료구조 & 알고리즘

정렬, 구현

2. 사고과정

1. C, C#, D, D# 등 #이 붙은 것과 안 붙은 것들을 어떻게 처리해 줄 것인가?
-> C#, D#은 모두 java의 문자열 메소드인 replaceAll 로 C,D,E,F,G,A,B 와 겹치지 않는 Y,U,I,O,P 로 대체하여서 1글자로 처리하였다.

2. 다음의 조건을 어떻게 처리할 것인가?

조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.

Music 클래스를 선언해서, Music 타입의 배열을 만든다. 그리고 그 배열에 제목, 총 실행 시간, 시작 시간을 기록해서 Comparator 을 이용해서 비교하여 정렬한다.

3. 시, 분 을 어떻게 처리할 것인가?
끝 시간에서 시작 시간을 뺄 때, 시간의 뺄셈에서 처리하기가 복잡하므로, 시간 x 60 + 분으로 환산하여 처리한다. 예를 들어, 03시 20분은 3 x 60 + 20 = 200 분이 된다.

3. 풀이과정

  1. 각 글자를 Y,U,I,O,P 로 변환.
  2. (끝 시간 - 시작시간) 만큼 반복하여 now 라는 단어를 생성. 그 단어에 그 반복 횟수만큼 1글자씩 단어의 길이를 추가해준다. 나머지 연산을 활용해서 length가 늘어나면 index를 0으로 처리.
  3. 그 문자열에 m 이 포함된다면 ( 여기서는 m에 Y,U,I,O,P를 새로 대체한 k라는 문자열) music타입 배열에 add한다.
  4. 기준에 따라 정렬한다.
  5. 배열이 비었다면, 조건에 맞게 (None)을 리턴하고, 배열이 비어있지 않다면, 정렬한 0번째 인덱스 값의 title을 리턴한다.

4. 소스코드

import java.util.*;
class Music{
    String title;
    int length;
    int startTime;
 
    Music(String title,int length,int startTime){
        this.title=title;
        this.length=length;
        this.startTime=startTime;
    }
}
class Solution {
   
    public String solution(String m, String[] musicinfo) {
        
        String k = replace(m,musicinfo);
    
        ArrayList<Music> list=new ArrayList<>();
      
      
        for(int i=0;i<musicinfo.length;i++){
            String musicinfos[]=musicinfo[i].split(",");
            String time1=musicinfos[0];
            String time2=musicinfos[1];
            String title=musicinfos[2];
            String cycle=musicinfos[3];
            String temp1[]=time1.split(":");
            String temp2[]=time2.split(":");
            int s_time= Integer.parseInt(temp1[0])*60 + Integer.parseInt(temp1[1]);
            int e_time= Integer.parseInt(temp2[0])*60 + Integer.parseInt(temp2[1]);
            
            String now="";
            int totalTime=e_time-s_time;
            
            for(int j=0;j<totalTime;j++){
                now+= cycle.charAt(j%cycle.length());
            }
    
            if(now.contains(k)){
                list.add(new Music(title,totalTime,s_time));
            }
            
        }
        
        Collections.sort(list,new Comparator<>(){
            @Override
            public int compare(Music m1,Music m2){
                if(m1.length<m2.length) return 1;
                else if(m1.length==m2.length){
                    if(m1.startTime>m2.startTime) return 1;
                }
                return -1;
            }
        });
        
        if(list.isEmpty()) return "(None)";
        
        String answer=list.get(0).title;
 
        return answer;
        
    }
    public static String replace(String m,String[] musicinfo) {
    
    for(int i=0;i<musicinfo.length;i++){
        String musicinfos[] = musicinfo[i].split(",");
        musicinfos[3]=  musicinfos[3].replaceAll("C#","Y");
        m=m.replaceAll("C#","Y");
         musicinfos[3]=  musicinfos[3].replaceAll("D#","U");
        m=m.replaceAll("D#","U");
          musicinfos[3]=  musicinfos[3].replaceAll("F#","I");
        m=m.replaceAll("F#","I");
          musicinfos[3]=  musicinfos[3].replaceAll("G#","O");
        m=m.replaceAll("G#","O");
          musicinfos[3]=  musicinfos[3].replaceAll("A#","P");
        m=m.replaceAll("A#","P");
        musicinfo[i]=musicinfos[0]+","+musicinfos[1]+","+musicinfos[2]+","+musicinfos[3];
    
    }
    
    return m;
}
}

5. 결과

6. 회고

문제 난이도에 비해 꽤 오래걸렸다.

중간 중간 오타도 많이 쳤고, YUIOP 로 대체하는 걸, QWERT 로 대체했는데, E 가 이미 있어서

-> 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.

그 오류를 찾는다고 애먹었다.
다음부터는 초반에 설계를 더 꼼꼼하게 해놓아야겠다고 생각했다.

하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람
post-custom-banner

0개의 댓글