← 전체 회차
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 펼침.