-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprogrammers_17683.swift
More file actions
109 lines (98 loc) · 5.73 KB
/
programmers_17683.swift
File metadata and controls
109 lines (98 loc) · 5.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//
// programmers_17683.swift
// algo
//
// Created by 이재은 on 2020/09/05.
// Copyright © 2020 이재은. All rights reserved.
//
import Foundation
//programmers 카카오 2018 [3차] 방금그곡 17683
//
//문제 설명
//방금그곡
//라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다.
//
//네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가정을 할 때 네오가 찾으려는 음악의 제목을 구하여라.
//
//방금그곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.
//네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
//각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.
//음악이 00:00를 넘겨서까지 재생되는 일은 없다.
//조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
//조건이 일치하는 음악이 없을 때에는 `(None)`을 반환한다.
//입력 형식
//입력으로 네오가 기억한 멜로디를 담은 문자열 m과 방송된 곡의 정보를 담고 있는 배열 musicinfos가 주어진다.
//
//m은 음 1개 이상 1439개 이하로 구성되어 있다.
//musicinfos는 100개 이하의 곡 정보를 담고 있는 배열로, 각각의 곡 정보는 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보가 ','로 구분된 문자열이다.
//음악의 시작 시각과 끝난 시각은 24시간 HH:MM 형식이다.
//음악 제목은 ',' 이외의 출력 가능한 문자로 표현된 길이 1 이상 64 이하의 문자열이다.
//악보 정보는 음 1개 이상 1439개 이하로 구성되어 있다.
//출력 형식
//조건과 일치하는 음악 제목을 출력한다.
//
//입출력 예시
//m musicinfos answer
//ABCDEFG [12:00,12:14,HELLO,CDEFGAB, 13:00,13:05,WORLD,ABCDEF] HELLO
//CC#BCC#BCC#BCC#B [03:00,03:30,FOO,CC#B, 04:00,04:08,BAR,CC#BCC#BCC#B] FOO
//ABC [12:00,12:14,HELLO,C#DEFGAB, 13:00,13:05,WORLD,ABCDEF] WORLD
//설명
//첫 번째 예시에서 HELLO는 길이가 7분이지만 12:00부터 12:14까지 재생되었으므로 실제로 CDEFGABCDEFGAB로 재생되었고, 이 중에 기억한 멜로디인 ABCDEFG가 들어있다.
//세 번째 예시에서 HELLO는 C#DEFGABC#DEFGAB로, WORLD는 ABCDE로 재생되었다. HELLO 안에 있는 ABC#은 기억한 멜로디인 ABC와 일치하지 않고, WORLD 안에 있는 ABC가 기억한 멜로디와 일치한다.
extension String {
func changeSharp() -> String {
var text = self
let notes = [("A#", "a"), ("C#", "c"), ("D#", "d"), ("F#", "f"), ("G#", "g")]
for i in 0..<notes.count {
text = text.replacingOccurrences(of: notes[i].0, with: notes[i].1)
}
return text
}
}
func calculateInterval(_ start: String, _ end: String) -> Int {
let format = DateFormatter()
format.dateFormat = "HH:mm"
let startTime = format.date(from: start)!
let endTime = format.date(from: end)!
return Int(endTime.timeIntervalSince(startTime)) / 60
}
func solution(_ m:String, _ musicinfos:[String]) -> String {
var musicInfos = [(start: String, end: String, title: String, melody: String)]()
musicinfos.forEach {
let info = $0.split(separator: ",").map { String($0) }
musicInfos.append((info[0], info[1], info[2], info[3].changeSharp()))
}
let m = m.changeSharp()
var musicTitles: [(String, Int)] = []
for i in 0..<musicInfos.count {
let interval = calculateInterval(musicInfos[i].start, musicInfos[i].end)
var playMelody = ""
while playMelody.count < interval {
for note in musicInfos[i].melody {
if playMelody.count >= interval {
break
}
playMelody += String(note)
}
}
if playMelody.contains(m) {
musicTitles.append((musicInfos[i].title, interval))
}
}
var result = ""
if !musicTitles.isEmpty {
var musicTitle = [musicTitles[0]]
for i in 0..<musicTitles.count {
if musicTitles[i].1 > musicTitle[0].1 {
musicTitle[0] = musicTitles[i]
}
}
result = musicTitle[0].0
} else {
result = "(None)"
}
return result
}
print(solution("ABCDEFG", ["12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"])) // HELLO
print(solution("CC#BCC#BCC#BCC#B", ["03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"])) // FOO
print(solution("ABC", ["12:00,12:14,HELLO,ABC#DEFGAB", "13:00,13:05,WORLD,ABCDEF"])) // WORLD