Skip to content

Commit 16a9c1c

Browse files
committed
[level 2] Title: [3차] 방금그곡, Time: 21.95 ms, Memory: 94.8 MB -BaekjoonHub
1 parent cffca50 commit 16a9c1c

File tree

2 files changed

+151
-0
lines changed

2 files changed

+151
-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+
메모리: 94.8 MB, 시간: 21.95 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년 08월 26일 17:17:06
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: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import java.util.*;
2+
import java.time.*;
3+
4+
class Solution {
5+
public String solution(String m, String[] musicinfos) {
6+
// #을 치환
7+
m = replaceShap(m);
8+
9+
int maxTime = 0;
10+
String answer = "(None)";
11+
12+
for(String musicinfo: musicinfos){
13+
String[] params = musicinfo.split(",");
14+
String title = params[2];
15+
String info = replaceShap(params[3]);
16+
17+
LocalTime start = LocalTime.parse(params[0]);
18+
LocalTime end = LocalTime.parse(params[1]);
19+
// 시간차
20+
int time = (int) Duration.between(start,end).toMinutes();
21+
22+
StringBuilder sb = new StringBuilder();
23+
char[] ch = info.toCharArray();
24+
int length = info.length();
25+
for(int i=0;i<time;i++){
26+
sb.append(ch[i%length]);
27+
}
28+
29+
// 유사성 체크
30+
if(checkCommon(m,sb.toString())){
31+
32+
// 새로운게 더 길면 -> 덮어씌움
33+
if(time > maxTime){
34+
maxTime = time;
35+
answer = title;
36+
}
37+
}
38+
}
39+
40+
// 제목 반환
41+
return answer;
42+
}
43+
44+
// 유사성 체크
45+
boolean checkCommon(String m,String info){
46+
// 멜로디가 info에 포함되는지
47+
if(info.contains(m)) return true;
48+
return false;
49+
}
50+
51+
String replaceShap(String info){
52+
return info.replaceAll("C#","H")
53+
.replaceAll("D#","I")
54+
.replaceAll("F#","J")
55+
.replaceAll("G#","K")
56+
.replaceAll("A#","L")
57+
.replaceAll("B#","M");
58+
}
59+
}

0 commit comments

Comments
 (0)