← 전체 회차
a-073-permutations2026-07-29mediumleetcode #46neetcode150

순열

#array#backtracking
leetcode #46 · a-073-permutations
01

문제

· problem
P.a-073-permutations

순열

leetcode #46

고유한 정수들로 이루어진 배열 nums가 주어질 때, 가능한 모든 순열을 반환하세요. 답은 어떤 순서로든 반환할 수 있습니다.

제약
  • · 1 ≤ nums.length ≤ 6
  • · -10 ≤ nums[i] ≤ 10
  • · All integers in nums are unique
// 지문은 본인 언어 요약 — 원문은 위 링크에서
입출력 예시
example 1input → output
[1,2,3]
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
example 2input → output
[0,1]
[[0,1],[1,0]]
example 3input → output
[1]
[[1]]
02

사전 사고

· pre-solve
● 1리스트 출력● 2선택● 3정답 공개
  • 순열이란 정확히 무엇인가요?
  • 모든 입력 정수는 고유한가요?
  • 출력 순열들의 순서가 정해져 있나요?
  • 한 순열 내에서 같은 원소를 여러 번 사용할 수 있나요?
  • 입력 배열을 수정해도 괜찮나요?
  • 반환된 배열들이 원본 참조여도 되나요?
던질 질문에 체크하고 확인을 누르세요
// 결과는 세션 메모리만 — 새로고침하면 초기화됩니다 (반복 학습)
03

논리 구조

· logic
● 1슬롯 출력● 2슬롯별 선택● 3정답 공개
// 각 슬롯에 들어갈 코드 한 줄을 골라 알고리즘 흐름을 합성해보세요. 코드는 안 짜지만 논리 뼈대는 직접.
step 1· 결과 초기화
res = []
res = {}
res = None
res = nums[:]
step 2· 기저 사례: 원소 1개
if len(nums) == 1:
if len(nums) == 0:
if len(nums) <= 1:
if len(nums) > 1:
step 3· 각 원소마다 반복
for i in range(len(nums)):
for n in nums:
for i in range(len(nums) - 1):
while i < len(nums):
step 4· 맨 앞 원소 제거중첩
n = nums.pop(0)
n = nums[i]
n = nums.pop()
n = nums.pop(i)
step 5· 재귀 호출로 부분 순열 구하기중첩
perms = self.permute(nums)
perms = self.permute([])
perms = self.permute(nums[1:])
perms = permute(nums)
step 6· 부분 순열에 현재 원소 추가중첩
perm.append(n)
perms.append(n)
perm.insert(0, n)
perm.extend([n, n])
step 7· 다음 반복을 위해 원소 복원중첩
nums.append(n)
nums.pop()
nums.insert(0, n)
pass
각 슬롯에 한 줄씩 골라보세요
// format: slot — 다른 패턴(재귀·DP 등) 은 ordering·state-first 등 별도 format. ADR-08 후속.
04

문제풀이 · 트레이스

· solve
solution.py
1
class Solution:
2
    def permute(self, nums: List[int]) -> List[List[int]]:
3
        res = []
4
5
        # base case
6
        if len(nums) == 1:
7
            return [nums[:]]  # nums[:] is a deep copy
8
9
        for i in range(len(nums)):
10
            n = nums.pop(0)
11
            perms = self.permute(nums)
12
13
            for perm in perms:
14
                perm.append(n)
15
            res.extend(perms)
16
            nums.append(n)
17
        return res
머릿속 dry-run 케이스
// 각 케이스를 머릿속으로 따라가보세요. 막히면 아래 worked example 펼침.
case 1
[1,2,3]
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
case 2
[0,1]
[[0,1],[1,0]]
case 3
[1]
[[1]]
// UI 가 walk-through 안 함 — 학습자가 머릿속으로. 막히면 worked example 펼침.