본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 방금그곡

https://school.programmers.co.kr/learn/courses/30/lessons/17683

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

먼저 #이 붙어 있는 경우 해당 음을 소문자로 바꾸었다.

ArrayList<String> st = new ArrayList<>();
for (int i = 0; i < m.length(); i++) {
    if (m.charAt(i) == '#') {
        st.set(st.size()-1, st.get(st.size()-1).toLowerCase());
    } else {
        st.add(String.valueOf(m.charAt(i)));
    }
}
StringBuilder mBuilder = new StringBuilder();
for (int i = 0; i < st.size(); i++) {
    mBuilder.append(st.get(i));
}
m = mBuilder.toString();
st.clear();

그 다음 주어진 정보를 바탕으로 음악 재생 시간을 기반으로 음악 정보를 반복하도록 만들었다.

재생시간 / 음악 정보의 길이 + 재생시간 % 음악 정보의 길이 만큼의 문자열을 만들고, 거기에 m이 있는지 확인

또는 재생 시간이 m의 길이보다 작을 경우에는 재생 시간만큼 음악 정보를 가지고 문자열을 만들고 m을 확인했다.

m이 존재하는 경우에 정답리스트에 곡의 제목을 추가하고 시간리스트에 재생 시간을 추가하였다.

ArrayList<String> answerList = new ArrayList<>();
ArrayList<Integer> timeList = new ArrayList<>();
for (int i = 0; i < musicinfos.length; i++) {
    StringBuilder sb = new StringBuilder();
    String[] s = musicinfos[i].split(",");
    String[] stt = s[0].split(":");
    String[] edt = s[1].split(":");
    for (int j = 0; j < s[3].length(); j++) {
        if (s[3].charAt(j) == '#') {
            st.set(st.size()-1, st.get(st.size()-1).toLowerCase());
        } else {
            st.add(String.valueOf(s[3].charAt(j)));
        }
    }
    s[3] = "";
    for (int j = 0; j < st.size(); j++) {
        s[3] += st.get(j);
    }
    int time = (Integer.parseInt(edt[0])*60 + Integer.parseInt(edt[1])) -
            (Integer.parseInt(stt[0])*60 + Integer.parseInt(stt[1]));
    /*if (time < 0) {
        time = 24*60 + (Integer.parseInt(edt[0])*60 + Integer.parseInt(edt[1])) -
                (Integer.parseInt(stt[0])*60 + Integer.parseInt(stt[1]));
    }*/
    for (int j = 0; j < (time / s[3].length()); j++) {
        sb.append(s[3]);
    }
    for (int j = 0; j < time % s[3].length(); j++) {
        sb.append(s[3].charAt(j));
    }
    if (sb.toString().contains(m)) {
        answerList.add(s[2]);
        timeList.add(time);
    }
    st.clear();
}

이후 정답 리스트 중에서 가장 재생 시간이 긴 것을 고르고 답으로 만들었다. 만약 없다면 "(None)"을 출력하였다.

int longest = 0;
int index = 0;
for (int i = 0; i < answerList.size(); i++) {
    if (timeList.get(i) > longest) {
        longest = timeList.get(i);
        index = i;
    }
}
if (!answerList.isEmpty()) {
    return answer = answerList.get(index);
} else {
    return "(None)";
}
import java.util.ArrayList;
class Solution {
    public String solution(String m, String[] musicinfos) {
        String answer = "";
        ArrayList<String> st = new ArrayList<>();
        for (int i = 0; i < m.length(); i++) {
            if (m.charAt(i) == '#') {
                st.set(st.size()-1, st.get(st.size()-1).toLowerCase());
            } else {
                st.add(String.valueOf(m.charAt(i)));
            }
        }
        StringBuilder mBuilder = new StringBuilder();
        for (int i = 0; i < st.size(); i++) {
            mBuilder.append(st.get(i));
        }
        m = mBuilder.toString();
        st.clear();
        ArrayList<String> answerList = new ArrayList<>();
        ArrayList<Integer> timeList = new ArrayList<>();
        for (int i = 0; i < musicinfos.length; i++) {
            StringBuilder sb = new StringBuilder();
            String[] s = musicinfos[i].split(",");
            String[] stt = s[0].split(":");
            String[] edt = s[1].split(":");
            for (int j = 0; j < s[3].length(); j++) {
                if (s[3].charAt(j) == '#') {
                    st.set(st.size()-1, st.get(st.size()-1).toLowerCase());
                } else {
                    st.add(String.valueOf(s[3].charAt(j)));
                }
            }
            s[3] = "";
            for (int j = 0; j < st.size(); j++) {
                s[3] += st.get(j);
            }
            /*
            int time = (Integer.parseInt(edt[0])*60 + Integer.parseInt(edt[1])) -
                    (Integer.parseInt(stt[0])*60 + Integer.parseInt(stt[1]));
            */
            for (int j = 0; j < (time / s[3].length()); j++) {
                sb.append(s[3]);
            }
            for (int j = 0; j < time % s[3].length(); j++) {
                sb.append(s[3].charAt(j));
            }
            if (sb.toString().contains(m)) {
                answerList.add(s[2]);
                timeList.add(time);
            }
            st.clear();
        }

        int longest = 0;
        int index = 0;
        for (int i = 0; i < answerList.size(); i++) {
            if (timeList.get(i) > longest) {
                longest = timeList.get(i);
                index = i;
            }
        }
        if (!answerList.isEmpty()) {
            return answer = answerList.get(index);
        } else {
            return "(None)";
        }
    }
}