본문 바로가기
iOS/애플 개발자 공식 문서

[Swift] 두 요소의 위치를 바꾸는 방법 (swap 함수 구현과 swapAt 인스턴스 메서드)

by Dev.Andy 2023. 5. 4.

들어가기 전에

글을 쓰게 된 이유

코딩테스트를 문제 하나를 풀고 있던 중, Swift 언어로 간단하게 배열의 두 요소를 바꾸고 싶은데 마음대로 되지 않았다. 내가 알던 swap의 알고리즘을 Swift에 적용해 보기도 했고, swapAt이라는 자체 인스턴스 메서드를 활용하여 요소를 바꿀 수 있는 걸 우여곡절 알게 되어서 이를 정리하기 위해 글을 쓰게 되었다.

 

C의 swap 구현

C 언어의 swap 구현

내가 C언어에서 알고 있는 방식의 swap 알고리즘이다. 이를 Swift에 적용해 보고 싶었다.
참고로 코드블럭 언어가 cpp로 적혀 있는 건 티스토리의 코드블럭에서 C가 없어서 그렇다.

#include <stdio.h>

void swap(int* a, int* b);

int main(void)
{
    int a = 1;
    int b = 2;
    printf("before swap: %d %d\n", a, b); // before swap: 1 2
    swap(&a, &b);
    printf("after swap: %d %d\n", a, b); // after swap: 2 1
}

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

 

Swift의 swap 구현

변수의 swap 구현

어렴풋이 알고 있는 inout을 이용해서 구현해 보았다.

아래와 같이 일반적인 변수에는 잘 적용이 되었다.

func swap(_  a: inout Int, _  b: inout Int) -> Void {
    var temp: Int
    
    temp = a
    a = b
    b = temp
}

var m = 3
var n = 7
swap(&m, &n)
print(m) // 7
print(n) // 3

 

2차원 배열에서의 swap은 실패

이번에는 이차원 배열의 순서를 바꾸고 싶었는데 에러를 계속해서 냈다.

위처럼 inout을 시도했으나 Swift 문법을 inout 깊게 알지는 못하여 엄청 헤맸다…

var input = [[60, 50], [30, 70]]
swap(&input[i][0], &input[i][1])
print(input[i][0])
print(input[i][1])

/*
error: inout writeback through subscript occurs in multiple arguments to call, introducing invalid aliasing
            swap(&input[i][0], &input[i][1])
                               ^~~~~~~~~~~~

passing value of type 'Int' to an inout parameter requires explicit '&'
*/

 

swapAt 인스턴스 메서드

공식 문서 내용

애플 개발자 공식 문서에서 swapAt 인스턴스 메서드를 찾기는 했지만 위에서 멘붕(!)이 와서 주의 깊게 읽지 못했다.

 

처음 swapAt을 시도한 코드 (실패)

swap 함수에만 집중 하다 보니 곧 바로 요소를 넣어 버렸다.

swapAt(input[i][0], input[i][1]) // cannot find 'swapAt' in scope

 

두 번째 swapAt을 시도한 코드 - 1차원 배열 인덱스 접근

배열에 온점(.)으로 접근하여 메서드를 넣고 인수(argument)로 인덱스를 넣었지만 1차원에서만 변경이 되었다. 내가 원하는 건 2차원 배열에서의 요소의 위치를 바꾸는 거였다.

var input = [[60, 50], [30, 70]]
input.swapAt(0, 1) // [[30, 70], [60, 50]]

 

두 번째 swapAt을 시도한 코드 - 2차원 배열 인덱스 접근

이제 드디어 접근을 할 수 있었다.

var input = [[60, 50], [30, 70]]
input[0].swapAt(0, 1) // [[50, 60], [30, 70]]

 

참고 자료

댓글