Swift 공부: Programmers [3차]방금그곡 level2 - 2018 kakao blind recruitment

syi07030·2022년 3월 27일
1

swift

목록 보기
3/4

문제 정보
https://programmers.co.kr/learn/courses/30/lessons/17683

이 문제의 핵심은 문자열 다루기, 문자열 치환이다.
가장 주의해야 할 점은

  • C#, D#, F#, G#, A# 과 같은 음들도 또 다른 하나의 음으로 생각해야 한다는 점
  • 조건이 일치하는 음악이 여러 개일 경우 실제로 라디오에서 재생된 시간이 제일 긴 음악, 재생된 시간이 같은 음악이 여러 개면 가장 먼저 입력된 음악 제목을 반환해야 한다는 점
    요정도가 있다.

본인은 처음에 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

피드백도 대환영🙆‍♀️

참조
https://www.linuxtut.com/en/df894d0a59d9d743c6f3/

profile
잭과 근나물

1개의 댓글

comment-user-thumbnail
2022년 3월 27일

우와... 멋있어요!!

답글 달기