[프로그래머스] PS/Java

[lv2] 방금그곡

SH3542 2024. 12. 15. 19:42

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

 

파싱 + 구현 문제다.

 

1. 음 전처리하기 (편의상 사용)

- 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.

 

#이 붙은 음들은 문자열 길이 판단 및 비교에 번거로우므로, 전처리한다.

여러 방법이 있겠지만, 나는 소문자로 변환하였다.

 

2. 재생한 곡 정보 파싱하기

(종료 시각 - 시작 시각)으로 총 시간을 구한다.

(문제 조건에서, 음악이 00:00을 넘어가는 경우는 없으므로 식을 단순하게 놓아도 된다.)

 

이후 전처리한 악보를 기반으로, idx를 mod 연산하며 풀 악보를 만든다.

 

3. 정답 해 추가하기

문제에서 해가 여러개 일 때 totalNum이 가장 긴 것이 답이므로, totalNum/title을 list에 넣어준다.

 

+ 추가 비교 조건에서, totalNum 또한 같다면 "먼저 재생한 곡"을 출력해야 한다.

 

그러나, 로직에서 먼저 재생한 곡 = idx이며,

sort 이후에도 같은 totalNum을 가진 원소에 한해서는 idx 순서가 변경되지 않으므로 고려하지 않아도 된다.

 

4. 답 출력하기

이 것 때문에 틀렸다. 해가 없다면

"None"이 아니라 "(None)"을 출력해야한다.

import java.util.*;

class Solution {
    public String solution(String m, String[] musicinfos) {
        String answer = "";
        int M = musicinfos.length;
        m = convToLower(m);

        List<String[]> list = new ArrayList<>();

        for(int i=0; i<M; i++) {
            String[] info = musicinfos[i].split(",");
            String stInfo = info[0];
            String edInfo = info[1];
            String title = info[2];
            String musicInfo = info[3];

            String[] st = stInfo.split(":");
            String[] ed = edInfo.split(":");

            int stNum = Integer.parseInt(st[0]) * 60 + Integer.parseInt(st[1]);
            int edNum = Integer.parseInt(ed[0]) * 60 + Integer.parseInt(ed[1]);
            int totalNum = edNum - stNum;

            String music = convToLower(musicInfo);
            String fullMusic = getFullMusic(music, totalNum);

            if(fullMusic.contains(m)) {
                list.add(new String[]{String.valueOf(totalNum), title});
            }
        }

        list.sort((s1, s2) -> Integer.valueOf(s2[0]) - Integer.valueOf(s1[0]));

        return list.isEmpty()? "(None)" : list.get(0)[1];
    }

    static String convToLower(String s) {

        StringBuilder sb = new StringBuilder();
        int S = s.length();
        for(int i=0; i<S; i++) {

            if(i+1 < S && s.charAt(i+1) == '#') {
                sb.append(Character.toLowerCase(s.charAt(i)));
                i++;
            }
            else {
                sb.append(s.charAt(i));
            }
        }

        return sb.toString();
    }

    static String getFullMusic(String s, int val) {

        StringBuilder sb = new StringBuilder();
        int S = s.length();

        for(int i=0; i<val; i++) {
            sb.append(s.charAt(i % S));
        }

        return sb.toString();
    }
}

'[프로그래머스] PS > Java' 카테고리의 다른 글

[lv3] 외벽 점검  (0) 2024.12.16
[lv2] 리코쳇 로봇  (2) 2024.12.15
[lv2] 줄 서는 방법  (1) 2024.12.15
[lv2] 배달  (0) 2024.12.13
[lv2] 시소 짝꿍  (0) 2024.12.12