ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 모각코PS / 카카오 3차 방금 그 곡
    PS 2022. 7. 23. 11:31

    모각코 PS스터디

    알고리즘 스터디가 10주차를 맞아 방학에 들어갔습니다.😃
    그간 많은 문제를 처음 접해보면서 참 즐거운 시간이었네요. PS 포스팅을 안한지 오래 되었는데... 방학을 기념해서 오랜만에 올려보려고 해요. :)
    늘 그렇듯 문제는 알고리즘 대장님께서 선정해주셨습니다.😃

    문제와 풀이


    문제 링크 : 프로그래머스 Lv2 - 방금 그 곡
    원 출처 : 카카오 블라인드 신입 공채 3차 - 4번 문제 방금 그 곡

    👇펼쳐서 코드와 해설 읽기

    여러가지 제약 조건을 주의하면, 로직 자체는 크게 어려울 것이 없습니다.

    public class Nick {
    
        public String solution(String m, String[] musicinfos) {
            String result = "(None)";   // 반환값
            int longestRunningTime = 0; // 일치한 곡이 재생된 시간
            m = sharpToLower(m);        // 네오가 들은 멜로디
    
            for (int i = 0; i < musicinfos.length; i++) {
                String[] info = musicinfos[i].split(",");
    
                // 필요한 변수 만들기: 재생시간, 제목, 악보, 곡 길이, 재생된 악보
                int runningTime  = getRunningTime(info[0], info[1]);
                String title     = info[2];
                String notes     = sharpToLower(info[3]);
                int songTime     = notes.length();
                String playNotes = getPlayNotes(notes, runningTime, songTime);
    
                // 비교
                if (playNotes.contains(m)) {
                    if ("(None)".equals(result)) { // 처음 일치하는 경우, 무조건 업데이트
                        result = title;
                        longestRunningTime = runningTime;
                    }
                    else { // 두번째 일치부터는, 재생된 시간이 더 길 경우에만 업데이트
                        if (longestRunningTime < runningTime) {
                            result = title;
                            longestRunningTime = runningTime;
                        }
                    }
                }
            }
    
            return result;
        }
    
        String sharpToLower(String str) {
            str = str.replace("C#", "c");
            str = str.replace("D#", "d");
            str = str.replace("F#", "f");
            str = str.replace("G#", "g");
            str = str.replace("A#", "a");
            return str;
        }
    
        int getRunningTime(String time1, String time2) {
            String[] t1 = time1.split(":");
            String[] t2 = time2.split(":");
            int startTime = (Integer.parseInt(t1[0]) * 60) + Integer.parseInt(t1[1]);
            int endTime = (Integer.parseInt(t2[0]) * 60) + Integer.parseInt(t2[1]);
            return endTime - startTime;
        }
    
        String getPlayNotes(String notes, int runningTime, int songTime) {
            int playCount = runningTime / songTime;
            int remainNotesCount = runningTime % songTime;
    
            String tmp = "";
            for (int i = 0; i < playCount; i++) {
                tmp += notes;
            }
            tmp += notes.substring(0, remainNotesCount);
    
            return tmp;
        }
    
    }

    마무리


    1트에 못풀었습니다.
    여러가지 제약조건의 향연에 휩쓸려서 그만 for/if문 파티를 벌인 것입니다. 🤣
    출제자의 의도인지 뭔지 모르겠지만 여튼 1시간 쯤 코딩을 하다 보니 '이젠 나도 무슨 말을 하는지 모르겠어' 상태가 되어서 IDE를 닫고 잠을 잤습니다.

    토요일 아침 집 주변 카페로 나가서 2트에 시도했습니다. 작성했던 코드는 전부 지웠습니다.
    다만 전날 밤 삽질을 하면서 머릿속에 새겨진 여러가지 제약 조건들 만큼은 선명했습니다.
    그것들을 하나씩 코드로 옮겼고 금세 완성할 수 있었어요.

    제약조건이 많을 때에는 어떤 제약이 우선하는지, 언제 만족해야 하는지 확실히 선후관계를 두고 코딩해야 한다는 점을 배웠습니다.
    실제 코딩테스트 때는 더욱 마음이 급할 텐데... 차분히 풀 수 있도록 연습을 해야겠다는 생각이 들었습니다.😁

    댓글

Designed by Tistory.