반응형
https://programmers.co.kr/learn/courses/30/lessons/17683
[ 문제풀이 ]
주어진 musicinfos의 악보를 재생된 시간만큼의 길이로 만들어서 기억한 멜로디 m이 존재하는지를 확인하면 되는 간단한 문제이다.
악보의 최대 길이는 00:00 ~ 23:59까지인 1439개밖에 안되기 때문에 모든 문자열을 탐색한다 하여도 시간 초과가 발생하지는 않을 것이다.
하지만 테스트 케이스 3번과 같은 경우를 조심해줘야 한다. HELLO의 악보는 "C#DEFGABC#DEFGAB"이기 때문에 "ABC" 와 "ABC#"처럼 "#"이 있는 경우를 따로 구분해줘야 하기 때문이다.
조건문을 통해 해결할 수 있지만 간단한 방법이 있다. "#"이 붙은 음을 다른 한문자로 치환해주면 된다. 이렇게 되면 따로 예외 처리를 해줄 필요 없이 쉽게 구현해줄 수 있다.
import java.util.*;
class Solution {
public String solution(String m, String[] musicinfos) {
String answer = "(None)";
int maxTime = 0;
m = change(m);
for (String musicinfo : musicinfos) {
String[] str = musicinfo.split(",");
int startTime = parseTime(str[0]);
int endTime = parseTime(str[1]);
int diff = endTime - startTime;
//재생된 현재 최대 시간보다 긴 경우만 확인
//같은 경우는 먼저 입력된 음악 제목을 반환하기 때문
if (diff > maxTime) {
str[3] = change(str[3]);
//재생 시간만큼 문자열을 붙여줌
StringBuilder sb = new StringBuilder();
int length = str[3].length();
int a = diff / length;
for (int i = 0; i < a; ++i) {
sb.append(str[3]);
}
int b = diff % length;
for (int i = 0; i < b; ++i) {
sb.append(str[3].charAt(i));
}
//멜로디 m을 포함하면 갱신
if (sb.toString().contains(m)) {
maxTime = diff;
answer = str[2];
}
}
}
return answer;
}
//"#"이 붙은 음을 다른 한 문자로 치환해줌
public String change(String s) {
s = s.replaceAll("C#", "c")
.replaceAll("D#", "d")
.replaceAll("F#", "f")
.replaceAll("G#", "g")
.replaceAll("A#", "a");
return s;
}
public int parseTime(String s) {
String[] time = s.split(":");
return Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
}
}
반응형
'Problem Solving > 카카오 블라인드 기출' 카테고리의 다른 글
2018 - [3차] 자동완성 (0) | 2021.08.07 |
---|---|
2018 - [3차] 압축 (0) | 2021.08.07 |
2018 - [1차] 다트 게임 (0) | 2021.08.07 |
2018 - [1차] 비밀지도 (0) | 2021.08.07 |
2018 - [1차] 캐시 (0) | 2021.08.07 |
댓글