https://leetcode.com/problems/next-permutation/description/
문제 분석
숫자가 주어졌을 때 다음 순열을 찾는 문제입니다.
처음 시도한 답안
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i = j = len(nums)-1
while i > 0 and nums[i-1] >= nums[i]:
i -= 1
if i == 0: # nums are in descending order
nums.reverse()
return
k = i - 1 # find the last "ascending" position
while nums[j] <= nums[k]:
j -= 1
nums[k], nums[j] = nums[j], nums[k]
l, r = k+1, len(nums)-1 # reverse the second part
while l < r:
nums[l], nums[r] = nums[r], nums[l]
l += 1
r -= 1
접근 방법
- nums 뒤에서부터 탐색하면서 오름차순이 깨지는 지점을 찾습니다.
- 위 지점은 i-1 이고 k로 설정합니다.
- 만약 i가 0 까지 도달한다면 내림차순으로 정렬이 된 상황(가장 뒤에 위치한 순열인 상황)입니다. 따라서 배열을 뒤집습니다.
- i가 0이 아니라면, 이번에는 뒤에서부터 k 지점의 숫자보다 처음으로 커지는 지점을 j를 찾습니다.
- k 와 j 지점의 값을 스왑합니다.
- k+1 지점부터의 값을 reverse 합니다.
이 문제의 경우 다음 순열을 구하는 알고리즘을 알고 있어야 풀이할 수 있습니다. 알고리즘의 중요한 포인트는 다음과 같습니다.
- 순열의 뒤에서부터 탐색하면서 뒤에서부터 보았을 때 오름차순이 처음으로 깨진 숫자(지점)인 k를 구합니다.
- 순열의 뒤에서부터 k값보다 큰 요소를 처음으로 만나는 지점 j를 구하고, k와 j를 스왑합니다.
- k+1 지점들의 값을 reverse 하면 다음 순열을 구할 수 있습니다.
nums = [1,2,3,6,9,5,4,0] 의 다음 순열은?
- 오름차순이 처음으로 깨지는 지점 k = 3, k_value = 6
- k_value(6)보다 처음으로 큰 요소 j = 4, j_value = 9
- k와 j를 스왑. nums = [1,2,3,9,6,5,4,0]
- k+1(4번째 인덱스) 지점부터 이후의 값들을 reverse. nums = [1,2,3,9,0,4,5,6]
728x90
'SW개발 > 코딩테스트' 카테고리의 다른 글
[LeetCode]Find First and Last Position of Element in Sorted Array (0) | 2023.05.05 |
---|---|
[LeetCode]Search in Rotated Sorted Array (0) | 2023.05.04 |
[LeetCode]Linked List Cycle (0) | 2023.05.02 |
[LeetCode]Single Number (0) | 2023.05.01 |
[LeetCode]Best Time to Buy and Sell Stock (0) | 2023.04.30 |