package main

func maximumSwap(num int) int {
	fromInt := func() (int, []int) {
		digits := make([]int, 9)

		i := 0
		for ; num > 0; i++ {
			digits[i] = num % 10
			num /= 10
		}

		return i, digits
	}

	toInt := func(digits []int) int {
		result := 0

		for i := len(digits) - 1; i >= 0; i-- {
			result *= 10
			result += digits[i]
		}

		return result
	}

	length, digits := fromInt()

	for i := length - 1; i > 0; i-- {
		max_index := i - 1
		for j := i - 1; j >= 0; j-- {
			if digits[j] > digits[i] && digits[j] >= digits[max_index] {
				max_index = j
			}
		}

		// found bigger digit that can be swapped
		if digits[max_index] > digits[i] {
			digits[max_index], digits[i] = digits[i], digits[max_index]
			return toInt(digits)
		}
	}

	// no swaps happened
	return toInt(digits)
}