Algorithm

[프로그래머스] 방금 그 곡 Java

yerinpark 2023. 8. 1. 09:10

입력 파싱, m을 musicinfo의 melody에서 찾기

-> 이렇게 하면 불필요하게 한 번 더 돌아야 한다. musicinfo의 melody를 m에서 찾기.

import java.util.Arrays;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";

        // 0. 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for(int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = tmp[3];
        }

        // 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
        // m의 0번째 인덱스를 musicinfos에서 찾는다.
        // musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
        // 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.

        String segment = "";

        for(int j = 0; j < m.length(); j++) {
            segment += m.charAt(j);
//            System.out.println("segment = " + segment);

            int lengthOfMusic = melody[0].length(); // 음악의 길이
//            System.out.println(lengthOfMusic);
            int idx = melody[0].indexOf(segment);

            if(idx + segment.length() == melody[0].length()) {
                System.out.println("멜로디 마지막");
                System.out.println(segment);

                System.out.println("m에서 segment 지움");
                m = m.replaceAll(segment, "");
                System.out.println(m);
            }

            if(idx != -1) {
                System.out.println("멜로디 인덱스");
                System.out.println(melody[0].charAt(idx));
            }



        }

        for(int i = 0; i < len; i++) {

        }

        // 하나의 musicinfos에 대하여
        // 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
        // segment에 해당하는 부분을 m에서 지운다.


        // Test case 2
        // CC#B CC#B CC#B CC#B
        // CC#B CC#B CC#B



        return answer;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
        String m = "ABCDEFG";
        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
//        String m = "ABC";
//        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        solution(m, musicinfos);
    }
}

 

 

 

while문을 쓰면 안 됨.

import java.util.Arrays;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";

        // 0. 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for(int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = tmp[3];
        }

        // 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
        // m의 0번째 인덱스를 musicinfos에서 찾는다.
        // musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
        // 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.

        String segment = "";

        int loop = 10;

        while(loop > 0) {
            loop--;

            if(melody[0].length() == 0) {
                System.out.println("이제 없어..");
                break;
            }

            for(int j = 0; j < melody[0].length(); j++) {
                segment += melody[0].charAt(j);
                System.out.println("segment = " + segment);

                int lengthOfMusic = m.length();
//            System.out.println(lengthOfMusic);
                int idx = m.indexOf(segment);

                System.out.println("idx = " + idx);

                if(idx + segment.length() == m.length()) {
                    System.out.println("멜로디 마지막");
                    System.out.println(segment);

                    System.out.println("m에서 segment 지움");
                    melody[0] = melody[0].replaceAll(segment, "");
                    System.out.println(melody[0]);

                    // segment 초기화
                    segment = "";
                    
                    // j 초기화
                    j = 0;
                }

                if(idx != -1) {
                    System.out.println("멜로디에 있음...");
                    System.out.println("melody[0]" + melody[0]);

                    if(melody[0].equals(segment)) {
                        System.out.println("일치함,,,");
                        break;
                    }
//                System.out.println("멜로디 인덱스");
//                System.out.println(m.charAt(idx));
                }



            }
        }



        for(int i = 0; i < len; i++) {

        }

        // 하나의 musicinfos에 대하여
        // 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
        // segment에 해당하는 부분을 m에서 지운다.


        // Test case 2
        // CC#B CC#B CC#B CC#B
        // CC#B CC#B CC#B



        return answer;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
        String m = "ABCDEFG";
        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
//        String m = "ABC";
//        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        solution(m, musicinfos);
    }
}

 

음악 하나에 대해 일치 여부 찾기

이제 음악의 개수만큼 for문 돌리기

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";
        
        // 일치하는 음악의 인덱스 저장
        ArrayList<Integer> candidate = new ArrayList<>();

        // 0. 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for(int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = tmp[3];
        }

        // 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
        // m의 0번째 인덱스를 musicinfos에서 찾는다.
        // musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
        // 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.

        String segment = "";


        for(int j = 0; j < melody[0].length(); j++) {
            System.out.println("------------");
            System.out.println("j = " + j);
            segment += melody[0].charAt(j);

            System.out.println("segment = " + segment);



            if(melody[0].length() == 0) {
                System.out.println("이제 없어..");
                break;
            }

            int lengthOfMusic = m.length();
//            System.out.println(lengthOfMusic);
            int idx = m.indexOf(segment);

            System.out.println("idx = " + idx);

            if(idx != -1) {
                System.out.println("멜로디에 있음...");
                System.out.println("melody[0]" + melody[0]);

                if(melody[0].equals(segment)) {
                    System.out.println("일치함,,,");
                    candidate.add(0);


                    System.out.println("m에서 segment 지움");
                    melody[0] = melody[0].replaceAll(segment, "");
                    System.out.println(melody[0]);
                    
                    break;
                }
//                System.out.println("멜로디 인덱스");
//                System.out.println(m.charAt(idx));
            }

            if(idx + segment.length() == m.length()) {
                System.out.println("멜로디 마지막");
                System.out.println(segment);

                System.out.println("m에서 segment 지움");
                melody[0] = melody[0].replaceAll(segment, "");
                System.out.println(melody[0]);

                // segment 초기화
                segment = "";

                // j 초기화
                j = -1; // 위에서 j = 1부터 시작함.. 왜지?

                // 밑에 실행하면 안 됨.
                continue;
            }





        }



        for(int i = 0; i < len; i++) {

        }

        // 하나의 musicinfos에 대하여
        // 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
        // segment에 해당하는 부분을 m에서 지운다.


        // Test case 2
        // CC#B CC#B CC#B CC#B
        // CC#B CC#B CC#B



        return answer;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
        String m = "ABCDEFG";
        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
//        String m = "ABC";
//        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        solution(m, musicinfos);
    }
}

 

어차피 조삼모사였고 m과 일치하는 melody를 찾아야 하므로 melody에서 m을 찾아야 한다.

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";

        // 일치하는 음악의 인덱스 저장
        ArrayList<Integer> candidate = new ArrayList<>();

        // 0. 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for(int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = tmp[3];
        }

        // 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
        // m의 0번째 인덱스를 musicinfos에서 찾는다.
        // musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
        // 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.

        String segment = "";

        for(int i = 0; i < len; i++) {
            for(int j = 0; j < melody[i].length(); j++) {
                System.out.println("------------");
                System.out.println("j = " + j);
                segment += melody[i].charAt(j);

                System.out.println("segment = " + segment);



                if(melody[i].length() == 0) {
                    System.out.println("이제 없어..");
                    break;
                }

                int lengthOfMusic = m.length();
//            System.out.println(lengthOfMusic);
                int idx = m.indexOf(segment);

                System.out.println("idx = " + idx);

                if(idx != -1) {
                    System.out.println("멜로디에 있음...");
                    System.out.println("melody[i]" + melody[i]);

                    if(melody[i].equals(segment)) {
                        System.out.println("일치함,,,");
                        candidate.add(i);


                        System.out.println("m에서 segment 지움");
                        melody[i] = melody[i].replaceAll(segment, "");
                        System.out.println(melody[i]);

                        break;
                    }
//                System.out.println("멜로디 인덱스");
//                System.out.println(m.charAt(idx));
                }

                if(idx + segment.length() == m.length()) {
                    System.out.println("멜로디 마지막");
                    System.out.println(segment);

                    System.out.println("m에서 segment 지움");
                    melody[i] = melody[i].replaceAll(segment, "");
                    System.out.println(melody[i]);

                    // segment 초기화
                    segment = "";

                    // j 초기화
                    j = -1; // 위에서 j = 1부터 시작함.. 왜지?

                    // 밑에 실행하면 안 됨.
                    continue;
                }





            }
        }

        System.out.println(candidate);

        // 하나의 musicinfos에 대하여
        // 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
        // segment에 해당하는 부분을 m에서 지운다.


        // Test case 2
        // CC#B CC#B CC#B CC#B
        // CC#B CC#B CC#B



        return answer;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
//        String m = "ABCDEFG";
//        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
        String m = "ABC";
        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        solution(m, musicinfos);
    }
}

 

이제 곡이 여러 번 반복되는 테스트케이스 2번만 해결하면 된다.

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";

        // 일치하는 음악의 인덱스 저장
        ArrayList<Integer> candidate = new ArrayList<>();

        // 0. 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for(int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = tmp[3];
        }

        // 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
        // m의 0번째 인덱스를 musicinfos에서 찾는다.
        // musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
        // 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.

        String segment = "";

        for(int i = 0; i < len; i++) {
            for(int j = 0; j < m.length(); j++) {
                System.out.println("------------");
                System.out.println("j = " + j);
                segment += m.charAt(j);

                System.out.println("segment = " + segment);



                if(m.length() == 0) {
                    System.out.println("이제 없어..");
                    break;
                }

                int lengthOfMusic = melody[i].length();
//            System.out.println(lengthOfMusic);
                int idx = melody[i].indexOf(segment);

                System.out.println("idx = " + idx);

                if(idx != -1) {
                    System.out.println("멜로디에 있음...");
                    System.out.println("m" + m);

                    if(m.equals(segment)) {
                        System.out.println("일치함,,,");
                        candidate.add(i);


                        System.out.println("m에서 segment 지움");
                        m = m.replaceAll(segment, "");
                        System.out.println(m);

                        break;
                    }
//                System.out.println("멜로디 인덱스");
//                System.out.println(m.charAt(idx));
                }

                if(idx + segment.length() == melody[i].length()) {
                    System.out.println("멜로디 마지막");
                    System.out.println(segment);

                    System.out.println("m에서 segment 지움");
                    m = m.replaceAll(segment, "");
                    System.out.println(m);

                    // segment 초기화
                    segment = "";

                    // j 초기화
                    j = -1; // 위에서 j = 1부터 시작함.. 왜지?

                    // 밑에 실행하면 안 됨.
                    continue;
                }





            }
        }

        System.out.println(candidate);

        // 하나의 musicinfos에 대하여
        // 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
        // segment에 해당하는 부분을 m에서 지운다.


        // Test case 2
        // CC#B CC#B CC#B CC#B
        // CC#B CC#B CC#B



        return answer;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
//        String m = "ABCDEFG";
//        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
        String m = "CC#BCC#BCC#BCC#B";
        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
//        String m = "ABC";
//        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        solution(m, musicinfos);
    }
}

 

Test case 1, 2 해결

음계 중 샾 파싱 다시하기

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";

        // 일치하는 음악의 인덱스 저장
        ArrayList<Integer> candidate = new ArrayList<>();

        // 0. 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for(int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = tmp[3];
        }

        // 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
        // m의 0번째 인덱스를 musicinfos에서 찾는다.
        // musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
        // 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.

        String segment = "";

        for(int i = 0; i < len; i++) {
            System.out.println("노래 제목 = " + title[i]);
            String music = m;

            for(int j = 0; j < music.length(); j++) {
                System.out.println("------------");
                System.out.println("j = " + j);
                segment += music.charAt(j);

                System.out.println("segment = " + segment);



                if(music.length() == 0) {
                    System.out.println("이제 없어..");
                    break;
                }

                int lengthOfMusic = melody[i].length();
//            System.out.println(lengthOfMusic);
                int idx = melody[i].indexOf(segment);

                System.out.println("idx = " + idx);

                if(idx != -1) {
                    System.out.println("멜로디에 있음...");
                    System.out.println("music" + music);

                    if(music.equals(segment)) {
                        System.out.println("일치함,,,");
                        candidate.add(i);


                        System.out.println("m에서 segment 지움");
                        music = music.replaceAll(segment, "");
                        System.out.println(music);

                        break;
                    }
//                System.out.println("멜로디 인덱스");
//                System.out.println(m.charAt(idx));
                }

                if(idx + segment.length() == melody[i].length()) {
                    System.out.println("멜로디 마지막");
                    System.out.println(segment);

                    System.out.println("m에서 segment 지움");
                    music = music.replaceAll(segment, "");
                    System.out.println(music);



                    // segment 초기화
                    segment = "";

                    // j 초기화
                    j = -1; // 위에서 j = 1부터 시작함.. 왜지?

                    // 밑에 실행하면 안 됨.
                    continue;
                }





            }
        }

        System.out.println(candidate);

        // 하나의 musicinfos에 대하여
        // 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
        // segment에 해당하는 부분을 m에서 지운다.


        // Test case 2
        // CC#B CC#B CC#B CC#B
        // CC#B CC#B CC#B



        return answer;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
//        String m = "ABCDEFG";
//        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
        String m = "ABC";
        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        solution(m, musicinfos);
    }
}

 

여기까지 했는데 30점 맞음

import java.util.ArrayList;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";

        // 일치하는 음악의 인덱스 저장
        ArrayList<Integer> candidate = new ArrayList<>();

        // 0. 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for(int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = tmp[3];
        }

        // 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
        // m의 0번째 인덱스를 musicinfos에서 찾는다.
        // musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
        // 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.

        String segment = "";

        for(int i = 0; i < len; i++) {
            System.out.println("노래 제목 = " + title[i]);
            String music = m;

            // segment 초기화
            segment = "";

            for(int j = 0; j < music.length(); j++) {
                System.out.println("------------");
                System.out.println("j = " + j);

                if(music.charAt(j) != '#') {
                    segment += music.charAt(j);
                }

                System.out.println("music입니다....");
                System.out.println(music);
                System.out.println("예...");

                if(j < music.length() - 1 && music.charAt(j + 1) == '#') {
                    segment += '#';
                } else if(music.length() > 1 && j == 0 && music.charAt(1) == '#') {
                    segment += '#';
                }
                System.out.println("segment = " + segment);



                if(music.length() == 0) {
                    System.out.println("이제 없어..");
                    break;
                }

                int lengthOfMusic = melody[i].length();
//            System.out.println(lengthOfMusic);
                int idx = melody[i].indexOf(segment);

                System.out.println("idx = " + idx);

                if(melody[i].charAt(idx + 1) != '#' && idx != -1) {
                    System.out.println("멜로디에 있음...");
                    System.out.println("music = " + music);

                    if(music.equals(segment)) {
                        System.out.println("일치함,,,");

                        if(candidate.isEmpty() || (melody[candidate.get(0)].length() > melody[i].length())) {
                            candidate.add(i);

                        }


                        System.out.println("m에서 segment 지움");
                        music = music.replaceAll(segment, "");
                        System.out.println(music);

                        break;
                    }
//                System.out.println("멜로디 인덱스");
//                System.out.println(m.charAt(idx));
                }

                if(idx + segment.length() == melody[i].length()) {
                    System.out.println("멜로디 마지막");
                    System.out.println(segment);

                    System.out.println("m에서 segment 지움");
                    music = music.replaceAll(segment, "");
                    System.out.println(music);

                    if(music.equals("")) {
                        if(candidate.isEmpty() || melody[candidate.get(0)].length() > melody[i].length()) {
                            candidate.add(i);

                        }
                    }

                    System.out.println("candidate = ");
                    System.out.println(candidate);



                    // segment 초기화
                    segment = "";

                    // j 초기화
                    j = -1; // 위에서 j = 1부터 시작함.. 왜지?

                    // 밑에 실행하면 안 됨.
                    continue;
                }





            }
        }




        // 하나의 musicinfos에 대하여
        // 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
        // segment에 해당하는 부분을 m에서 지운다.


        // Test case 2
        // CC#B CC#B CC#B CC#B
        // CC#B CC#B CC#B

        System.out.println("sdlkfsjdljsdkldjfslksdf");
        System.out.println(candidate.get(0));

        answer = title[candidate.get(0)];


        return answer;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
//        String m = "ABCDEFG";
//        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
        String m = "ABC";
        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        System.out.println(solution(m, musicinfos));
    }
}

 

#을 새로운 문자로 모두 치환하는 아이디어(참고)

import java.util.ArrayList;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";

        // 일치하는 음악의 인덱스 저장
        ArrayList<Integer> candidate = new ArrayList<>();

        // 0. 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for(int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = changeMelody(tmp[3]);
        }

        // 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
        // m의 0번째 인덱스를 musicinfos에서 찾는다.
        // musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
        // 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.

        String segment = "";

        for(int i = 0; i < len; i++) {
            System.out.println("노래 제목 = " + title[i]);
            String music = m;

            // segment 초기화
            segment = "";

            for(int j = 0; j < music.length(); j++) {
                System.out.println("------------");
                System.out.println("j = " + j);

                if(music.charAt(j) != '#') {
                    segment += music.charAt(j);
                }

                System.out.println("music입니다....");
                System.out.println(music);
                System.out.println("예...");

                if(j < music.length() - 1 && music.charAt(j + 1) == '#') {
                    segment += '#';
                } else if(music.length() > 1 && j == 0 && music.charAt(1) == '#') {
                    segment += '#';
                }
                System.out.println("segment = " + segment);



                if(music.length() == 0) {
                    System.out.println("이제 없어..");
                    break;
                }

                int lengthOfMusic = melody[i].length();
//            System.out.println(lengthOfMusic);
                int idx = melody[i].indexOf(segment);

                System.out.println("idx = " + idx);

                if(melody[i].charAt(idx + 1) != '#' && idx != -1) {
                    System.out.println("멜로디에 있음...");
                    System.out.println("music = " + music);

                    if(music.equals(segment)) {
                        System.out.println("일치함,,,");

                        if(candidate.isEmpty() || (melody[candidate.get(0)].length() > melody[i].length())) {
                            candidate.add(i);

                        }


                        System.out.println("m에서 segment 지움");
                        music = music.replaceAll(segment, "");
                        System.out.println(music);

                        break;
                    }
//                System.out.println("멜로디 인덱스");
//                System.out.println(m.charAt(idx));
                }

                if(idx + segment.length() == melody[i].length()) {
                    System.out.println("멜로디 마지막");
                    System.out.println(segment);

                    System.out.println("m에서 segment 지움");
                    music = music.replaceAll(segment, "");
                    System.out.println(music);

                    if(music.equals("")) {
                        if(candidate.isEmpty() || melody[candidate.get(0)].length() > melody[i].length()) {
                            candidate.add(i);

                        }
                    }

                    System.out.println("candidate = ");
                    System.out.println(candidate);



                    // segment 초기화
                    segment = "";

                    // j 초기화
                    j = -1; // 위에서 j = 1부터 시작함.. 왜지?

                    // 밑에 실행하면 안 됨.
                    continue;
                }





            }
        }




        // 하나의 musicinfos에 대하여
        // 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
        // segment에 해당하는 부분을 m에서 지운다.


        // Test case 2
        // CC#B CC#B CC#B CC#B
        // CC#B CC#B CC#B

        System.out.println("sdlkfsjdljsdkldjfslksdf");
        System.out.println(candidate.get(0));

        answer = title[candidate.get(0)];


        return answer;
    }

    // 치환하는 아이디어
    static String changeMelody(String oldMelody) {
        oldMelody = oldMelody.replaceAll("C#", "H");
        oldMelody = oldMelody.replaceAll("D#", "I");
        oldMelody = oldMelody.replaceAll("F#", "J");
        oldMelody = oldMelody.replaceAll("G#", "K");
        String newMelody = oldMelody.replaceAll("A#", "L");

        return newMelody;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
//        String m = "ABCDEFG";
//        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
        String m = "ABC";
        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        System.out.println(solution(m, musicinfos));
    }
}

 

230810

case 3에서 중간부터 시작하는게 안 됨

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "";

        // 정답 인덱스
        int answerIdx = -1;

        // # 치환
        m = changeMelody(m);

        // 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for (int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = changeMelody(tmp[3]);
        }


        // 각 곡마다 재생 시간만큼 돌면서 확인
        for (int i = 0; i < musicinfos.length; i++) {

            // 기억한 멜로디가 음악 재생 시간보다 길면 빠져나온다.
            if (m.length() > time[i]) break;

            // melody의 시작음을 네오가 기억하는 m의 인덱스에서 찾는다.
            int start = m.indexOf(melody[i].charAt(0));

            
            // 네오가 중간부터 들으면 어떡하지..

            System.out.println(i);
            System.out.println(start);

            int flag = 0; // 일치하지 않음을 나타내는 플래그

            // melody를 재생 시간만큼 돌린다.
            for (int j = 0; j < time[i]; j++) {
                System.out.println((j + start) % m.length());
//                m.charAt((j + start) % m.length());

                // m과 melody가 일치하는지 확인
                if (m.charAt((j + start) % m.length()) == melody[i].charAt(j % melody[i].length())) {
                    // m의 마지막 인덱스까지 일치할 때 answer에 넣는다.
                    if (j == m.length() - 1) {
                        System.out.println("들어왔니");
                        // 비교할 answer가 없을 때
                        if (Objects.equals(answer, "")) {
                            answerIdx = i;
                            answer = title[i];
                        } else {
                            // 기존의 answer가 있을 때 재생 시간이 더 긴 음악을 할당
                            if(time[answerIdx] < time[i]) {
                                answerIdx = i;
                                answer = title[i];
                            }
                        }
                        break;
                    }
                } else {
                    System.out.println("일치하지 않음.");
                    break;
                }

//                System.out.println(melody[i].charAt(j % melody[i].length()));

            }


        }
        System.out.println(answer);

        return answer;
    }

    // 치환
    static String changeMelody(String oldMelody) {
        oldMelody = oldMelody.replaceAll("C#", "H");
        oldMelody = oldMelody.replaceAll("D#", "I");
        oldMelody = oldMelody.replaceAll("F#", "J");
        oldMelody = oldMelody.replaceAll("G#", "K");

        String newMelody = oldMelody.replaceAll("A#", "L");

        return newMelody;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
//        String m = "ABCDEFG";
//        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
        String m = "ABC";
        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        System.out.println(solution(m, musicinfos));
    }
}

 

중간부터 반복되는 구절이 있을 때 이 코드로 파악할 수 없음.

import java.util.Objects;

class Solution {
    public static String solution(String m, String[] musicinfos) {
        String answer = "(None)";

        int idx = -1;

        // # 치환
        m = changeMelody(m);

        // 파싱하기
        // musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
        int len = musicinfos.length;

        int[] time = new int[len];
        String[] title = new String[len];
        String[] melody = new String[len];

        for (int i = 0; i < len; i++) {
            String[] tmp = musicinfos[i].split(",");

            tmp[1] = tmp[1].replaceAll(":", "");
            tmp[0] = tmp[0].replaceAll(":", "");

            time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);

            title[i] = tmp[2];
            melody[i] = changeMelody(tmp[3]);
        }


        // 각 곡마다 재생 시간만큼 돌면서 확인
        for (int i = 0; i < musicinfos.length; i++) {

            // 기억한 멜로디가 음악 재생 시간보다 길면 빠져나온다.
            if (m.length() > time[i]) break;

            // melody의 시작음을 네오가 기억하는 m의 인덱스에서 찾는다.
//            int start = m.indexOf(melody[i].charAt(0));

            // m의 시작을 melody의 인덱스에서 찾는다. -> 반복되는 음이 있기 때문에 문장으로 찾아야 한다.
            int start = melody[i].indexOf(m.charAt(0));



            if(start == -1) break;

            // 네오가 중간부터 들으면 어떡하지..

//            System.out.println(i);
//            System.out.println(start);

            int flag = 0; // 일치하지 않음을 나타내는 플래그



            // melody를 재생 시간만큼 돌린다.
            for (int j = 0; j < time[i]; j++) {
                System.out.println((j + start) % melody[i].length());
//                m.charAt((j + start) % m.length());

                // m과 melody가 일치하는지 확인
                if (m.charAt(j % m.length()) == melody[i].charAt((j + start) % melody[i].length())) {
                    // m의 마지막 인덱스까지 일치할 때 answer에 넣는다.
                    if (j == m.length() - 1) {
                        System.out.println("들어왔니");
                        // 비교할 answer가 없을 때
                        if (Objects.equals(answer, "(None)")) {
                            answer = title[i];
                            idx = i;
                        } else {
                            // 기존의 answer가 있을 때 재생 시간이 더 긴 음악을 할당
                            if(time[idx] < time[i]) { ///////////////////
                                answer = title[i];
                                idx = i;
                            }
                        }
                        break;
                    }
                } else {
                    System.out.println("일치하지 않음.");
                    break;
                }

//                System.out.println(melody[i].charAt(j % melody[i].length()));

            }


        }
        System.out.println(answer);

        return answer;
    }

    // 치환
    static String changeMelody(String oldMelody) {
        oldMelody = oldMelody.replaceAll("C#", "H");
        oldMelody = oldMelody.replaceAll("D#", "I");
        oldMelody = oldMelody.replaceAll("F#", "J");
        oldMelody = oldMelody.replaceAll("G#", "K");

        String newMelody = oldMelody.replaceAll("A#", "L");

        return newMelody;
    }

    public static void main(String[] args) {
        // Test case 1 : "HELLO"
//        String m = "ABCDEFG";
//        String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 2 : "FOO"
//        String m = "CC#BCC#BCC#BCC#B";
//        String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};

        // Test case 3: "WORLD"
//        String m = "ABC";
//        String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};

        // Test case 4: "HELLO"
        String m = "CDCDF";
        String[] musicinfos = {"12:00,12:14,HELLO,CDCDCDF", "13:00,13:59,WORLD,AA"};

        System.out.println(solution(m, musicinfos));
    }
}

'Algorithm' 카테고리의 다른 글

DFS와 BFS  (0) 2023.10.09
파일명 정렬  (0) 2023.08.03
[프로그래머스] 캐시  (0) 2023.07.18
[프로그래머스] Java 요격 시스템  (0) 2023.06.30
[프로그래머스] 완주하지 못한 선수 Java  (0) 2023.06.20