티스토리 뷰
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/17683
💡 구현 아이디어
- #이 붙은 음계는 해당 음의 소문자로 변경
- 재생된 시간만큼 악보를 생성
- 생성된 악보에 m이 포함되는지 확인
- 결과 반환
💻 코드
func solution(_ m:String, _ musicinfos:[String]) -> String {
// 입력값 변환
let m = convertM(m).joined()
// musicinfos에서 필요한 정보로 변환 후 정리
var musics: [(title:String, len: Int, info: String)] = []
// 최종적으로 필요한 정보
var result: (title: String, len: Int, info: String) = (title: "", len: -1, info: "")
// 입력값 정리
for musicinfo in musicinfos {
// 정보별 분리
let arr = musicinfo.split(separator: ",").map{ String($0) }
// 필요한 정보
let title = arr[2]
let len = convertHToM(value: arr[1]) - convertHToM(value: arr[0])
let info = playedMusic(info:arr[3], len: len)
musics.append((title, len, info))
}
// 결과 도출
for music in musics {
if music.info.contains(m) && (result.len == -1 || music.len > result.len) {
result = music
}
}
return result.len == -1 ? "(None)" : result.title
}
// "HH:MM"을 입력으로 주면 Int형 플레이한 분을 반환
func convertHToM(value: String) -> Int {
let valueArr = value.split(separator:":").map{ Int(String($0))! }
return valueArr[0] * 60 + valueArr[1]
}
// 악보 정보와 재생시간을 주면 재생된 전체 악보를 반환
func playedMusic(info: String, len: Int) -> String {
var infos = convertM(info)
var result: String = ""
let loop = len / infos.count // 반복횟수
let num = len % infos.count // 몇자리까지
for _ in 0..<loop {
result += infos.joined()
}
for i in 0..<num {
result += infos[i]
}
return result
}
// #이 붙은 음계를 #을 떼고 소문자로 바꿔서 반환
func convertM(_ str: String) -> [String] {
var result: [String] = []
var arr = Array(str).map { String($0) }
for cha in arr {
let str = String(cha)
if str != "#" {
result.append(str)
} else {
result[result.count-1] += str
}
}
for value in result.enumerated() {
if value.element.contains("#") {
let arr = Array(value.element).map { String($0) }
result[value.offset] = arr[0].lowercased()
}
}
return result
}
❌ 틀린 이유 및 틀린 부분
ABC# 은 ABC가 아니었다!
- 처음엔 단순히 반복만 했더니 틀렸는데 m이 ABC일때 악보가 ABC#이면 단순반복하고 포함을 따지면 true가 나와서 틀렸다 → 이후 C#을 c로 바꿔서 풀어서 정답
⏳ 시간 복잡도
전체적으로 O(N)이 넘어가는 부분이 없으므로 O(N)
- 최대 24시간, 악보 정보 1439 이하, 곡의 수가 100개 이므로 최대 반복은 100 * 1439 * 24 * 60 = 약 2억 이지만 한곡을 24시간 틀경우 곡의 수가 1로 감소하니 100곡을 24시간 틀었을때가 최대로 사실상 24 * 60 * 1439 = 2백만 조금 넘는 수치가 나온다
📌 풀이 또는 기억할 정보
'PS > 문제 풀이' 카테고리의 다른 글
| [프로그래머스/Swift] 154540번 - 무인도 여행 (2) | 2025.04.06 |
|---|---|
| [프로그래머스/Swift] 67257번 - 수식 최대화 (0) | 2025.04.05 |
| [프로그래머스/Swift] 12952번 - N-Queen (0) | 2025.04.03 |
| [프로그래머스/Swift] 60058번 - 괄호 변환 (1) | 2025.04.02 |
| [프로그래머스/Swift] 159993번 - 미로 탈출 (0) | 2025.04.01 |
