💬 문제
[3차] 방금그곡
💬 Idea
- 재생 시간을 분 단위로 계산하기
- 분 단위 기반으로 총 재생된 모든 음계 계산하기
- 이 때 #이 들어간 음계의 string을 변환하여 저장하기 위해 Array 형태를 사용했다
- CC#DEF → [C, C#, D, E, F] 로 변환하여 저장
- m과 비교하여 일치할 시 dict에 저장
- [재생시간: [음악제목]]
💬 풀이
func solution(m:String, musicinfos:[String])->String{varanswerDict:[Int:[String]]=[:]formusicinfoin musicinfos {letmusicInfo= musicinfo.components(separatedBy:",").map({String($0)})
// 시간 분 단위로 계산
letplayedMinute=calMinute(musicInfo[0],musicInfo[1])
// 분 단위 기반으로 음계 계산
letplayedSyllable=calSyllable(playedMinute,convertSyllabletoArr(musicInfo[3]))
// m과 비교하여 dict에 저장
if playedSyllable.contains(convertSyllabletoArr(m)){ifanswerDict[playedMinute]==nil{answerDict[playedMinute]=[musicInfo[2]]}else{answerDict[playedMinute]?.append(musicInfo[2])}}}if answerDict.isEmpty {return"(None)"}else{return answerDict.sorted(by:{ $0.key > $1.key })[0].value[0]}}
// 재생시간 계산 메서드
func calMinute(_ start:String, _ end:String)->Int{letstart=Int(start.replacingOccurrences(of:":", with:""))??0letend=Int(end.replacingOccurrences(of:":", with:""))??0if start /100< end /100{return(60-(start %100))+((end /100- start /100-1)*60)+(end %100)}else{return(((end - start)/100)*60)+((end - start)%100)}}
// C, C#을 정확하게 구분하여 표현하기 위해 음계를 Array로 변환하는 메서드
func convertSyllabletoArr(_ syllable:String)->[String]{varsyllableArr=Array(syllable).map({String($0)})for(idx, s)in syllableArr.enumerated(){if s =="#"{syllableArr[idx -1]+="#"}}return syllableArr.filter({ $0 !="#"})}
// 총 재생된 음계 계산 메서드
func calSyllable(_ minute:Int, _ syllable:[String])->[String]{returnArray(repeatElement(syllable, count: minute / syllable.count)).flatMap{ $0 }+ syllable[0..<minute % syllable.count]}하 .. Programmers.. 배열간 contains가 안먹힌다… 그래서 재풀이… ^^..
- 재생 시간을 분 단위로 계산하기
- 분 단위 기반으로 총 재생된 모든 음계 계산하기
- 이 때 #이 들어간 음계의 string을 소문자로 변환하여 저장해주었다. 계산의 편의성을 위해 Array 형태 사용은 동일.
- CC#DEF → [C, c, D, E, F] 로 변환하여 저장
- m과 비교하여 일치할 시 dict에 저장
- 이 때 배열, 배열간 contains가 안먹히므로 배열을 모두 joined()해주어 하나의 string으로 변환한 뒤 문자열 비교를 해주었다.
func solution(m:String, musicinfos:[String])->String{varanswerDict:[Int:[String]]=[:]formusicinfoin musicinfos {letmusicInfo= musicinfo.components(separatedBy:",").map({String($0)})letplayedMinute=calMinute(musicInfo[0],musicInfo[1])letplayedSyllable=calSyllable(playedMinute,convertSyllabletoArr(musicInfo[3]))if playedSyllable.joined().contains(convertSyllabletoArr(m).joined()){ifanswerDict[playedMinute]==nil{answerDict[playedMinute]=[musicInfo[2]]}else{answerDict[playedMinute]?.append(musicInfo[2])}}}if answerDict.isEmpty {return"(None)"}else{return answerDict.sorted(by:{ $0.key > $1.key })[0].value[0]}}
// 재생시간 계산 메서드
func calMinute(_ start:String, _ end:String)->Int{letstart=Int(start.replacingOccurrences(of:":", with:""))??0letend=Int(end.replacingOccurrences(of:":", with:""))??0if start /100< end /100{return(60-(start %100))+((end /100- start /100-1)*60)+(end %100)}else{return(((end - start)/100)*60)+((end - start)%100)}}
// C, C#을 정확하게 구분하여 표현하기 위해 #음계를 소문자로 변환하고 Array로 변환하는 메서드
func convertSyllabletoArr(_ syllable:String)->[String]{varsyllableArr=Array(syllable).map({String($0)})for(idx, s)in syllableArr.enumerated(){if s =="#"{syllableArr[idx -1]=syllableArr[idx -1].lowercased()}}return syllableArr.filter({ $0 !="#"})}
// 총 재생된 음계 계산 메서드
func calSyllable(_ minute:Int, _ syllable:[String])->[String]{returnArray(repeatElement(syllable, count: minute / syllable.count)).flatMap{ $0 }+ syllable[0..<minute % syllable.count]}
💬 문제[3차] 방금그곡
💬 Idea💬 풀이하 .. Programmers.. 배열간 contains가 안먹힌다… 그래서 재풀이… ^^..