티스토리 뷰

🔗 문제 링크

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

💡 구현 아이디어

  1. #이 붙은 음계는 해당 음의 소문자로 변경
  2. 재생된 시간만큼 악보를 생성
  3. 생성된 악보에 m이 포함되는지 확인
  4. 결과 반환

💻 코드

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백만 조금 넘는 수치가 나온다

📌 풀이 또는 기억할 정보

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
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
글 보관함