[알고리즘] Swift -프로그래머스 연습문제 #178871(달리기 경주)

2023. 5. 30. 20:22ALGORITHM/Swift

728x90
반응형

 

문제링크

 

 

 

 

분석

해설진은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부른다.

예를 들어 1등부터 3등까지 mumu, soe, poe 선수들이 순서대로 달리고 있을 때

해설진이 seo 선수를 불렀다면 1등인 mumu 선수를 추월했다는 뜻이다.

즉 seo 선수가 1등, mumu 선수가 2등으로 바뀐다.

 

선수들의 이름이 1등부터 현재 등수 순서대로 담긴 배열과 해설진이 부른 이름이 담긴 배열이 주어질 때, 경기가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아서 리턴하는 문제이다.

 

풀이 과정

해설진이 부른 이름의 인덱스를 앞의 선수의 인덱스와 변경해준다.

더보기
import Foundation

func solution(_ players:[String], _ callings:[String]) -> [String] {
    var players = players
    
    for calling in callings {
        if let index = players.firstIndex(of: calling) {
            players.swapAt(index-1, index)
        }
    }
    
    return players
}

배열로 index를 찾게 될 경우에 만약 꼴등의 선수를 부르게 된다면 마지막까지 반복문을 돌리게 되서 시간이 오래 걸린다.

dictionary를 이용하여 해당하는 선수의 이름을 찾아 등수를 변경해주면 빠르게 할 수 있다.

 

풀이

import Foundation

func solution(_ players:[String], _ callings:[String]) -> [String]  {
    var players = players
    var player = [String: Int]()

    for (index, name) in players.enumerated() {
        player[name] = index
    }

    for name in callings {
        guard let index = player[name] else {
            continue
        }
        let pre = index - 1

        players.swapAt(pre, index)
        player[players[pre]]! -= 1
        player[players[index]]! += 1
    }

    return players
}

 

결과

print(solution(["mumu", "soe", "poe", "kai", "mine"]    , ["kai", "kai", "mine", "mine"]    ))

 

 


📂  정리

enumerated()

  • 배열을 가지고 반복문을 돌릴 때 순서와 요소를 튜플형태로 리턴해주는 메소드

 

swapAt()

  • 인덱스를 이용하여 값을 변경시키는 메소드

 

 

 

 

728x90
반응형