본문 바로가기
프로그래머스

프로그래머스 lv2 - 방금그곡 (자바) [2018 KAKAO BLIND RECRUITMENT]

by dragonDeok 2024. 6. 13.
728x90

문제


프로그래머스 lv2 - 방금그곡

풀이


방법 1

  • 처음 시도한 방법
  • 음별로 나눠서 처리하기 위해 음마다 배열에 순서대로 담아서 배열끼리 비교하는 방식
  • 코드가 너무 복잡해져서 실수가 발생하여 절반 정도의 테스트 케이스만 맞힘

방법 2

  • #이 붙어있는 음을 악보에 없는 음으로 치환
  • 코드가 깔끔해져서 실수를 하지 않고 모든 테스트 케이스 통과했음

어려웠던 점


문제 접근 방식을 처음에 복잡한 방법으로 접근하여 고생을 많이 했다.

코드


첫 번째 풀이 ( 62.9점 맞음 ) - 배열에 악보에 있는 음별로 저장해서 비교

import java.util.*; 
class Solution { 
    public String solution(String m, String[] musicinfos) { 
        String ans = ""; 
        int time = 0; 
        for (String s : musicinfos) { 
            String[] arr = s.split(","); 
            String[] st = arr[0].split(":"); 
            String[] ed = arr[1].split(":"); 
            int minute = (Integer.parseInt(ed[0]) - Integer.parseInt(st[0])) * 60 + (Integer.parseInt(ed[1]) - Integer.parseInt(st[1])); 
            ArrayList<String> list = new ArrayList<>(); // 코드별로 저장할 리스트 
            for (int i = 0; i < arr[3].length(); i++) { 
                if (i < arr[3].length() - 1 && arr[3].charAt(i + 1) == '#') { 
                    list.add(arr[3].substring(i, i + 2)); i++; 
                } else { 
                    list.add(arr[3].charAt(i) + ""); 
                } 
            } 
            String record = ""; // 흘러나온 멜로디 
            int idx = 0; 
            for (int i = 0; i < minute; i++) { 
                idx = i % list.size(); 
                record += list.get(idx); 
            } 
            if (record.contains(m)) { 
                int i = record.indexOf(m); 
                if (i + m.length() - 1 < record.length() && record.charAt(i + m.length()) == '#') { 
                    continue; 
                } else { 
                    if (minute > time) { 
                        ans = arr[2]; 
                        time = minute; 
                    } 
                } 
            } 
        } 
        if (ans.isEmpty()) 
            ans = "(None)"; 

        return ans; 
    } 
}

두 번째 풀이 ( 통과 ) - '#이 붙어있는 음'을 악보에 없는 새로운 문자로 치환해서 비교

import java.util.*; 
class Solution { 
    HashMap<String, String> hm = new HashMap<>(); 
    public String solution(String m, String[] musicinfos) { 
        String ans = ""; 
        int time = 0; 
        hm.put("C#", "c"); 
        hm.put("D#", "d"); 
        hm.put("F#", "f"); 
        hm.put("G#", "g"); 
        hm.put("A#", "a"); 
        hm.put("B#", "b"); 

        for (String s : musicinfos) { 
            String[] arr = s.split(","); 
            String[] st = arr[0].split(":"); 
            String[] ed = arr[1].split(":"); 
            int minute = (Integer.parseInt(ed[0]) - Integer.parseInt(st[0])) * 60 + (Integer.parseInt(ed[1]) - Integer.parseInt(st[1])); 
            String melody = converting(arr[3]); // 음악 한 곡의 멜로디 
            String neo = converting(m); // 네오가 기억한 멜로디 
            String record = ""; // 노래가 재생된 시간동안 흘러나온 멜로디 
            for (int i = 0; i < minute; i++) 
                record += melody.charAt(i % melody.length()); 

            if (record.contains(neo)) { 
                if (minute > time) { 
                    ans = arr[2]; 
                    time = minute; 
                } 
            } 
        } 

        if (ans.isEmpty()) 
            ans = "(None)"; 

        return ans; 
    } 

    String converting(String s) { 
        String str = ""; 
        for (int i = 0; i < s.length(); i++) { 
            if (i < s.length() - 1 && s.charAt(i + 1) == '#') { 
                str += hm.get(s.substring(i, i + 2)); 
                i++; 
            } 
            else 
                str += s.charAt(i); 
        } 
        return str; 
    } 
}

참고


첫 풀이로 풀리지 않아서 카카오 공채 코딩테스트 설명을 참고