요르딩딩

프로그래머스 : 방금그곡 본문

[코딩테스트]/문제풀이

프로그래머스 : 방금그곡

요르딩딩 2022. 4. 20. 14:37
728x90
반응형

이번문제는 문자열에 관련된 문제이다.

 

처음에는 쉽게 접근했으나, 조건들이 여러개 있거 확인하는데, 시간이 걸렸던것 같다.

 

여기서는 몇가지 포인트들만 구현할 줄 알면 된다.

 

포인트는 아래 3가지가 있다.

  1. 특수한 두개의 문자를 중복되지 않는 한개의 문자로 대체해서 사용한다.
  2. 시간간의 차이는 모두 분으로 만들어 계산한다. : 06:30 ~ 07:10 -> 430 - 390 = 40
  3. 일정한 숫자를 반복해서 붙일때 : 나머지(%) 사용 5/4 = 1...(1) = (인덱스 % 반복길이)

추가로 런타임에러가 났었는데, 아래 2가지를 수정하여 해결했다.

  1.  시간차이, 제목을 저장할 map 대신 static 변수 사용으로 대체
  2. if문 두번 질의하던것을 OR을 적용하여 하나의 if문으로 수행 
import java.util.*;
class Solution {
    static String[] shapSt = {"A#", "C#", "D#", "F#", "G#"};
    static String[] shapCh = {"1" , "2" , "3" , "4" , "5"}; //1음절이면서 중복되지 않는 값으로 대체*****
    static int timeGab;
    static String name;


    public String solution(String m, String[] musicinfos) {
        String answer = "";
        timeGab =0;
        name =null;

        //m값 # 대체
        for(int j=0; j< shapSt.length; j++) { 
            if(m.contains(shapSt[j])){
                m = m.replaceAll(shapSt[j], shapCh[j]);
            }
        }

        for(int i =0; i<musicinfos.length; i++) {
            String[] arr = musicinfos[i].split(",");
            String[] time0 = arr[0].split(":");
            String[] time1 = arr[1].split(":");
            String naming  = arr[2];
            String music   = arr[3];

            //분크기 계산 - 모두 분으로 치환후 빼기 *****
            int ho = Integer.parseInt(time1[0])*60 - Integer.parseInt(time0[0])*60;
            int mi = Integer.parseInt(time1[1]) - Integer.parseInt(time0[1]);
            int gap = ho + mi;

            //음악 # 대체
            for(int j=0; j< shapSt.length; j++) { 
                if(music.contains(shapSt[j])) {
                    music = music.replaceAll(shapSt[j], shapCh[j]);
                }
            }

            //음 붙이기
            String st ="";
            int size = music.length();
            for(int j=0; j < gap; j++) { 
                st+= music.charAt(j%size); //반복을 위해 나머지값을 사용 5/4 = 1...(1) = (인덱스 % 반복길이)*****
            } 

            //제목찾기
            if(st.contains(m)) {  // String.contains(st) 가능*****
                if(timeGab == 0 || timeGab - gap < 0) {
                    timeGab = gap;
                    name = naming;
                    continue;
                }
            }
        }

        if(name == null) { //일치하는 것이 없을 경우
            return "(None)";    
        }
        else {
            answer = name;  
        }

        return answer;
    }
}
728x90
반응형
Comments