고 언어 (Go lang)에서 값의 스왑 (swap) 방법

2023. 6. 5. 08:15Programming/JAVA, C++, Go, Rust

    목차
반응형

Go lang에서 값을 swap 하는 방법에 대해 살펴보겠습니다.
간단하게 다음의 문제를 풀면서 swap을 적용해 보겠습니다.

nums = [3, 2, 1, 4]

위와같은 배열이 있습니다. 배열의 값 1은 배열의 좌측끝으로, 배열 내 값 4는 배열의 우측 끝으로 이동시키고자 합니다.
이때 이동 방법은 인접한 두 개의 값을 서로 swap 하는 방법으로만 이동 할 수 있습니다.

다음과 같이 위 알고리즘 문제를 해결하면서 swap을 적용해 볼 수 있습니다.

func swap(val1 *int, val2 *int) {
    temp := *val1
    *val1 = *val2
    *val2 = temp
}

func semiOrderedPermutation(nums []int) int {
    i := 0
    one_idx := -1
    n_idx := -1
    cnt := 0

    for idx, val := range nums {
        if val == 1 {
            one_idx = idx
        }
    }

    i = one_idx

    for i > 0 {        
        swap(&nums[i - 1], &nums[i])
        cnt += 1
        i -= 1
    }

    for idx, val := range nums {
        if val == len(nums) {
            n_idx = idx
        }
    }

    i = n_idx

    for i < len(nums) - 1 {        
        swap(&nums[i], &nums[i + 1])
        cnt += 1
        i += 1
    }

    return cnt
}

swap 하는 부분의 코드를 살펴보면, func라는 keyword를 사용한 점과 변수 선언 시 type 보다 변수 명이 먼저 온다는 점을 제외하고는 C 언어의 포인터 문법과 같아 보입니다.
swap 함수는 두 개의 해당 type에 대한 인자를 포인터 타입으로 받아들인 이를 swap 합니다.

func swap(val1 *int, val2 *int) {
    temp := *val1
    *val1 = *val2
    *val2 = temp
}

Go 1.17 version 이후에는 Generics를 지원합니다. 이를 이용하면 다음과 같이 type 별로 swap 함수를 작성하지 않아도 됩니다.

func Swap[T any](a, b, *T) {
    temp := *a
    *a = *b
    *b = temp
}
반응형