문제 정보
https://programmers.co.kr/learn/courses/30/lessons/17683
이 문제의 핵심은 문자열 다루기, 문자열 치환이다.
가장 주의해야 할 점은
본인은 처음에 C#과 같은 음들을 고려하지 않고 코드를 짰다가
ABC와 ABC#은 다르다는 입출력 예시 3번에서 실패를 했다.
이 경우에는 문자열 치환이 해답이 될 수 있다.
여러 개의 문자를 각각 다른 문자로 치환해야 하므로 replacingOccurrences를 다음과 같이 사용할 수도 있지만
string.replacingOccurrences(of: "C#", with: "c")
.replacingOccurrences(of: "D#", with: "d")
.replacingOccurrences(of: "F#", with: "f")
.replacingOccurrences(of: "G#", with: "g")
.replacingOccurrences(of: "A#", with: "a")
이렇게 dictionary를 이용할 수도 있다.
let dict = ["C#":"c", "D#":"d", "F#":"f", "G#":"g", "A#":"a"]
var ss: String {
return dict.reduce(m){
$0.replacingOccurrences(of:$1.key, with:$1.value)}}
또한 조건을 만족하는 음악의 제목과 실제 라디오에서 재생된 시간을 차례대로 answer라는 string 배열에 넣었고
이후에 곡이 한 개 이상 answer에 있을 경우 시간들을 비교해 가장 큰 시간의 firstIndex를 구해서 answer[해당 인덱스 - 1]에 있는 음악 제목을 반환했다.(왜냐하면 짝수번째 인덱스에는 음악 제목 곡을 그 다음 홀수번째 인덱스에는 시간을 넣었기 때문이다)
모든 조건을 만족시켰다 생각하고 제출 후 채점하기를 했지만
문제는,,계속해서 테스트케이스 6,7,8,9,21,27번이 틀렸다,,
얼마나 계속해서 틀렸으면 외워버림
정말 문제가 있었던 곳은 예상치 못했던 곳이었다
바로 실제 재생 시간을 구하는 부분이었는데
예를 들어 시작 시간이 12:50, 끝나는 시간이 13:05일 때
실제 시간은 15분이다. 나는 처음에 다음과 같이 코드를 짰었다.
let start = arr[0].components(separatedBy:":")
let startInt = start.map{Int($0)!}
let finish = arr[1].components(separatedBy:":")
let finishInt = finish.map{Int($0)!}
//재생된 시간
let radioLength = finishInt[0]*60+finishInt[1] - startInt[0]*60+startInt[1]
나는 위의 코드에서 틀린 것이 없다고 생각했다.
그런데 실제로 12:50, 13:05를 넣어서 해보니 재생된 시간이 115가 나오는 것이었다.
아래와 같이 괄호를 해주니 그제서야 15로 제대로 나왔다,,ㅠ
let radioLength = (finishInt[0]*60+finishInt[1]) - (startInt[0]*60+startInt[1])
혹시 6,7,8,9,21,27 틀리시는 분들은 재생 시간을 다시 한 번 확인하기를😭
전체 코드는 다음과 같다.
import Foundation
func solution(_ m:String, _ musicinfos:[String]) -> String {
var answer = [String]()
let dict = ["C#":"c", "D#":"d", "F#":"f", "G#":"g", "A#":"a"]
var ss: String {
return dict.reduce(m){
$0.replacingOccurrences(of:$1.key, with:$1.value)}}
print(ss)
for i in musicinfos{
let arr = i.components(separatedBy:",")
let str = arr[3]
var sss: String {
return dict.reduce(str){
$0.replacingOccurrences(of:$1.key, with:$1.value)}}
let musicLength = sss.count //음악 길이
var realmusic = "" //실제 재생된 음악 악보
let start = arr[0].components(separatedBy:":")
let startInt = start.map{Int($0)!}
let finish = arr[1].components(separatedBy:":")
let finishInt = finish.map{Int($0)!}
let radioLength = (finishInt[0]*60+finishInt[1]) - (startInt[0]*60+startInt[1]) //재생된 시간
let music = Array(sss)
var ii = 0
while(realmusic.count<radioLength){
realmusic += String(music[ii%musicLength])
ii += 1
}
if realmusic.contains(ss){
answer.append(arr[2])
answer.append(String(radioLength))
}
}
if answer.count == 2 {
return answer[0]
}else if answer.count > 2 {
var times = [Int]()
for (i,time) in answer.enumerated(){
if i%2 == 1 {
times += [Int(time)!]
}
}
return answer[answer.firstIndex(of:String(times.max()!))!-1]
}else{
return "(None)"
}
}
또다른 프로그래머스 문제들에 대한 풀이는 요기에🌱
https://github.com/syi07030/algorithm
피드백도 대환영🙆♀️
우와... 멋있어요!!