반응형

문제출처

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

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, ��

programmers.co.kr

 

문제풀이

문제에서 주어진 조건대로 문자열 처리를 하고 구현하면 되는 문제다. 여기서 핵심은 #이 붙은 문자 처리 방법이라고 생각한다. 본인은 #이붙은 문자를 convertSound(String m) 메서드를 통해 소문자로 치환한뒤 구현했다. 또한 나중에 악보를 생성할때를 생각해서 곡의 재생시간을 구할때 단위를 분으로 통일했다.

 

이 문제는 오해의 소지가 있다고 생각한다. 지문에서 `(None)`을 리턴한다고 했는데 실제로는 `(None)`이 아니라 (None)을 리턴해줘야 하기 때문이다.

 

소스코드

https://github.com/sw93/algorithm/blob/master/Programmers/%EC%B9%B4%EC%B9%B4%EC%98%A4%20-%20%EB%B0%A9%EA%B8%88%EA%B7%B8%EA%B3%A1.java

 

sw93/algorithm

problem solve. Contribute to sw93/algorithm development by creating an account on GitHub.

github.com

 

class Solution {
// #이 붙은 음을 소문자로 치환
private String convertSound(String m) {
m = m.replaceAll("C#", "c");
m = m.replaceAll("D#", "d");
m = m.replaceAll("F#", "f");
m = m.replaceAll("G#", "g");
m = m.replaceAll("A#", "a");
return m;
}
// 곡의 재생시간을 분으로 환산
private int getRunningTime(String startInfo, String endInfo) {
int runningTime = 0;
int startHour = Integer.parseInt(startInfo.split(":")[0]);
int startMinute = Integer.parseInt(startInfo.split(":")[1]);
int endHour = Integer.parseInt(endInfo.split(":")[0]);
int endMinute = Integer.parseInt(endInfo.split(":")[1]);
return (endHour - startHour) * 60 + (endMinute - startMinute);
}
// 재생 시간만큼 재생해 악보를 만듬
private String playMusic(String sound, int runningTime) {
StringBuilder sb = new StringBuilder();
int soundLength = sound.length();
for (int i=0; i<runningTime; i++) {
sb.append(sound.charAt(i % soundLength));
}
return sb.toString();
}
public String solution(String m, String[] musicinfos) {
String answer = "(None)";
m = convertSound(m);
int maxRunningTime = 0;
for (String info : musicinfos) {
String[] musicInfo = info.split(",");
int runningTime = getRunningTime(musicInfo[0], musicInfo[1]);
String musicName = musicInfo[2];
String sound = convertSound(musicInfo[3]);
// 곡 정보를 재생해서 만든 악보
String music = playMusic(sound, runningTime);
// 정보를 통해 만든 악보가 기억한 악보와 다르다면 제외
if (!music.contains(m)) continue;
// 악보가 같은경우 재생시간이 긴 제목을 반환
if (runningTime > maxRunningTime) {
answer = musicName;
maxRunningTime = runningTime;
}
}
return answer;
}
}
반응형

+ Recent posts