본문 바로가기

iOS 앱 개발자 프로젝트/알고리즘 코드카타

[Algorithm] 달리기 경주 (w/ Swift)

달리기 경주

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

language = swift

func solution(_ players:[String], _ callings:[String]) -> [String] {

    var yeon = players
    var runner: [String: Int] = [:]

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

    for calling in callings {
        var index = runner[calling]!

        yeon.swapAt(index - 1, index)

        runner[yeon[index]] = index
        runner[yeon[index - 1]] = index - 1
    }

    return yeon
}

 

 

우선, players 배열과 callings 배열을 사용하여 특정 게임의 플레이어 순서를 변경하는 로직을 구현했다. players 배열에 게임 참가자의 이름을 순서대로 나열하고, callings 배열에는 순서 변경을 위해 호출한 플레이어의 이름을 순서대로 나열한다.

 

var runner: [String: Int] = [:]

 

Swift에서 [:]는 특정 타입의 빈 딕셔너리를 초기화하는 방법이다.  runner는 String을 키로, Int를 값으로 가지는 빈 딕셔너리로 선언했다. 따라서, 이 딕셔너리는 문자열과 정수의 쌍을 저장할 수 있게 되었다.

 

최종적으로

callings 배열에 따라 players 배열의 순서를 조정(swap 함수)하여 플레이어 순서를 반환해 준다.

 

 

로직 
  • 플레이어 초기화: yeon 변수에 players 배열의 복사본을 할당하여, 이 배열을 직접 수정하며 순서를 변경
  • 플레이어 인덱스 매핑: runner 딕셔너리를 사용하여 각 플레이어의 이름을 키로, 해당 플레이어의 인덱스를 값으로 저장 → 플레이어의 이름으로 빠르게 인덱스를 찾을 수 있다.
순서 변경 로직
  • 호출된 플레이어 처리: callings 배열을 순회하며 각 호출된 플레이어에 대해 다음 작업을 수행
반환 값
  • 최종 플레이어 순서: 순서 변경이 완료된 yeon 배열 반환

 

 

※  references

 

 

여기서 잠깐, swap 함수 복습하기

result.swapAt(index, index-1)
index를 index-1로 바꿔준다.

var example = [1, 2, 3, 4, 5]
// 배열의 인덱스를 적어준다.

example.swapAt(1, 2)

print(example)

// [1, 3, 2, 4, 5]