Skip to content

Commit 9bfe565

Browse files
committed
[level 2] Title: [3차] 방금그곡, Time: 44.73 ms, Memory: 106 MB -BaekjoonHub
1 parent eaae9b6 commit 9bfe565

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# [level 2] [3차] 방금그곡 - 17683
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/17683)
4+
5+
### 성능 요약
6+
7+
메모리: 106 MB, 시간: 44.73 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 10월 11일 00:04:12
20+
21+
### 문제 설명
22+
23+
<h2>방금그곡</h2>
24+
25+
<p>라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다.</p>
26+
27+
<p>네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가정을 할 때 네오가 찾으려는 음악의 제목을 구하여라.</p>
28+
29+
<ul>
30+
<li>방금그곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.</li>
31+
<li>네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.</li>
32+
<li>각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.</li>
33+
<li>음악이 00:00를 넘겨서까지 재생되는 일은 없다.</li>
34+
<li>조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.</li>
35+
<li>조건이 일치하는 음악이 없을 때에는 “<code>(None)</code>”을 반환한다.</li>
36+
</ul>
37+
38+
<h3>입력 형식</h3>
39+
40+
<p>입력으로 네오가 기억한 멜로디를 담은 문자열 <code>m</code>과 방송된 곡의 정보를 담고 있는 배열 <code>musicinfos</code>가 주어진다.</p>
41+
42+
<ul>
43+
<li><code>m</code>은 음 <code>1</code>개 이상 <code>1439</code>개 이하로 구성되어 있다.</li>
44+
<li><code>musicinfos</code>는 <code>100</code>개 이하의 곡 정보를 담고 있는 배열로, 각각의 곡 정보는 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보가 '<code>,</code>'로 구분된 문자열이다.</li>
45+
<li>음악의 시작 시각과 끝난 시각은 24시간 <code>HH:MM</code> 형식이다.</li>
46+
<li>음악 제목은 '<code>,</code>' 이외의 출력 가능한 문자로 표현된 길이 <code>1</code> 이상 <code>64</code> 이하의 문자열이다.</li>
47+
<li>악보 정보는 음 <code>1</code>개 이상 <code>1439</code>개 이하로 구성되어 있다.</li>
48+
</ul>
49+
50+
<h3>출력 형식</h3>
51+
52+
<p>조건과 일치하는 음악 제목을 출력한다.</p>
53+
54+
<h3>입출력 예시</h3>
55+
<table class="table">
56+
<thead><tr>
57+
<th>m</th>
58+
<th>musicinfos</th>
59+
<th>answer</th>
60+
</tr>
61+
</thead>
62+
<tbody><tr>
63+
<td>"ABCDEFG"</td>
64+
<td>["12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"]</td>
65+
<td>"HELLO"</td>
66+
</tr>
67+
<tr>
68+
<td>"CC#BCC#BCC#BCC#B"</td>
69+
<td>["03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"]</td>
70+
<td>"FOO"</td>
71+
</tr>
72+
<tr>
73+
<td>"ABC"</td>
74+
<td>["12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"]</td>
75+
<td>"WORLD"</td>
76+
</tr>
77+
</tbody>
78+
</table>
79+
<h3>설명</h3>
80+
81+
<p>첫 번째 예시에서 HELLO는 길이가 7분이지만 12:00부터 12:14까지 재생되었으므로 실제로 CDEFGABCDEFGAB로 재생되었고, 이 중에 기억한 멜로디인 ABCDEFG가 들어있다.<br>
82+
세 번째 예시에서 HELLO는 C#DEFGABC#DEFGAB로, WORLD는 ABCDE로 재생되었다. HELLO 안에 있는 ABC#은 기억한 멜로디인 ABC와 일치하지 않고, WORLD 안에 있는 ABC가 기억한 멜로디와 일치한다.</p>
83+
84+
<p><a href="http://tech.kakao.com/2017/11/14/kakao-blind-recruitment-round-3/" target="_blank" rel="noopener">해설 보러가기</a></p>
85+
86+
87+
<hr>
88+
89+
<p>※ 공지 - 2024년 2월 21일 테스트 케이스가 추가되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.</p>
90+
91+
92+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import java.util.*;
2+
import java.time.*;
3+
4+
class Solution {
5+
public String solution(String m, String[] musicinfos) {
6+
String answer = "";
7+
int answerDiff = Integer.MIN_VALUE;
8+
String[] music = new String[musicinfos.length];
9+
10+
11+
String inputNeoMelody = normalize(m);
12+
13+
System.out.println(inputNeoMelody);
14+
15+
for(int i=0; i<musicinfos.length; i++) {
16+
17+
String[] input = musicinfos[i].split(",");
18+
String[] beforeTime = input[0].split(":");
19+
String[] afterTime = input[1].split(":");
20+
21+
String inputMusicMelody = normalize(input[3]);
22+
LocalTime before = LocalTime.of(Integer.parseInt(beforeTime[0]), Integer.parseInt(beforeTime[1]));
23+
LocalTime after = LocalTime.of(Integer.parseInt(afterTime[0]), Integer.parseInt(afterTime[1]));
24+
int diff = (int) Duration.between(before, after).toMinutes();
25+
26+
String melody = "";
27+
28+
int repeat = diff / inputMusicMelody.length();
29+
30+
while(repeat !=0) {
31+
repeat--;
32+
melody += inputMusicMelody;
33+
}
34+
int remain = diff % inputMusicMelody.length();
35+
melody += inputMusicMelody.substring(0, remain);
36+
if(melody.contains(inputNeoMelody)) {
37+
if(diff > answerDiff) {
38+
answer = input[2];
39+
answerDiff = diff;
40+
}
41+
}
42+
}
43+
if(answer.equals("")) {
44+
return "(None)";
45+
}
46+
return answer;
47+
}
48+
49+
public String normalize(String input) {
50+
String returnString = "";
51+
52+
for(int i =0; i<input.length()-1; i++) {
53+
if(input.charAt(i) == '#') continue;
54+
if(input.charAt(i+1) == '#') {
55+
returnString += (input.charAt(i) + "").toLowerCase();
56+
}
57+
else {
58+
returnString += input.charAt(i) +"";
59+
}
60+
}
61+
if(input.charAt(input.length()-1) != '#') {
62+
returnString += input.charAt(input.length()-1) +"";
63+
}
64+
return returnString;
65+
}
66+
}

0 commit comments

Comments
 (0)