728x90
문제
풀이
방법 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;
}
}
참고
첫 풀이로 풀리지 않아서 카카오 공채 코딩테스트 설명을 참고
'프로그래머스' 카테고리의 다른 글
프로그래머스 lv2 - 뉴스 클러스터링 (자바) [2018 KAKAO BLIND RECRUITMENT] (2) | 2024.06.15 |
---|---|
프로그래머스 lv2 - 프렌즈4블록 (자바) [2018 KAKAO BLIND RECRUITMENT] (0) | 2024.06.14 |
프로그래머스 lv2 - 파일명 정리 (자바) [2018 KAKAO BLIND RECRUITMENT] (0) | 2024.06.11 |
프로그래머스 lv2 - n진수 게임 (자바) [2018 KAKAO BLIND RECRUITMENT] (2) | 2024.06.09 |
프로그래머스 lv2 - 후보키 (자바) [2019 KAKAO BLIND RECRUITMENT] (0) | 2024.06.08 |