[Python] 15655 N과 M(6)

2022. 6. 10. 16:53· Algorithm/Recursion & Backtracking
목차
  1. A. 접근
  2. B. 코드 분석
  3. 전체 코드
  4. B-1. 준비
  5. B-2. 풀이

문제

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.

  • N개의 자연수 중에서 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

문제 풀이

A. 접근

이번 문제는 15652 N과 M(4) 문제를 응용한 문제이다.

오름차순이며, 순서를 고려하지 않고 출력해야 한다.

B. 코드 분석

전체 코드

n, m = map(int, input().split())
num = sorted(map(int, input().split()))

arr = []

def bt(idx, cnt):
    if cnt == m:
        print(*arr)
        return

    for i in range(idx, len(num)):
        arr.append(num[i])
        bt(i + 1, cnt + 1)
        arr.pop()

bt(0, 0)

B-1. 준비

n, m = map(int, input().split())
num = sorted(map(int, input().split()))

arr = []

제출을 위해 사용할 리스트를 준비한다.

B-2. 풀이

def bt(idx, cnt):
    if cnt == m:
        print(*arr)
        return

    for i in range(idx, len(num)):
        arr.append(num[i])
        bt(i + 1, cnt + 1)
        arr.pop()

bt(0, 0)

재귀를 들어가기 전에 for 문에서 idx부터 시작하는 것에 주목을 하자. idx는 주어진 배열에서 수를 받을 위치를 지정한다. 예를 들어

4 2
9 8 7 1

이렇게 입력이 주어지면

for i in range(0, 4):

이런 반복문이 시작이 되고, arr = [1]이 되며 bt(1, 1)로 함수를 다시 실행한다.

for i in range(1, 4):

이후에 반복문이 위와 같이 설정이 되며, [1, 7, 8, 9] 에서 [7, 8, 9]만 반복문에 사용하는 셈이 된다. 이것을 쭉 반복한다.

이렇게 하는 이유는 오름차순으로 출력해야 되기 때문이며, 미리 정렬을 해두었기 때문이다.

총평

백트래킹에 대한 감이 조금 잡히고 있다.

 

'Algorithm > Recursion & Backtracking' 카테고리의 다른 글

[Python] 15663 N과 M(9)  (0) 2022.06.11
[Python] 15657 N과 M(8)  (0) 2022.06.10
[Python] 15656 N과 M(7)  (0) 2022.06.10
[Python] 15654 N과 M(5)  (0) 2022.06.10
[Python] 15652 N과 M(4)  (0) 2022.06.10
  1. A. 접근
  2. B. 코드 분석
  3. 전체 코드
  4. B-1. 준비
  5. B-2. 풀이
'Algorithm/Recursion & Backtracking' 카테고리의 다른 글
  • [Python] 15657 N과 M(8)
  • [Python] 15656 N과 M(7)
  • [Python] 15654 N과 M(5)
  • [Python] 15652 N과 M(4)
턴태
턴태
import { Dream } from "future";
턴태
턴태의 밑바닥부터 시작하는 de-vlog
턴태
전체
오늘
어제
  • ROOT (187)
    • Node.js (37)
      • ES6 (1)
      • TypeScript (3)
      • Express.js (16)
      • NestJS (16)
      • JS (24)
    • 프론트엔드 (29)
      • CS (5)
    • 백엔드 (1)
      • 검색 (2)
      • Database (1)
    • 기타 툴 (1)
      • git (1)
    • 데브옵스 & 인프라 (19)
      • Kubernetes (15)
      • Docker (2)
      • Monitoring (1)
      • IaC (1)
    • Algorithm (90)
      • Implementation & simulation (5)
      • Math (4)
      • Brute Force (1)
      • String (0)
      • Graph (5)
      • Recursion & Backtracking (19)
      • Divide & Conquer (2)
      • Dynamic Programming (18)
      • Greedy (13)
      • Priority Queue (2)
      • Binary Search (6)
      • Data Structure (7)
      • Shortest Path (5)
      • Minimum Spanning Tree (1)
      • Sorting (1)
      • Prefix Sum (1)
    • Linux (1)
      • Ubuntu (1)
    • Diary (5)
      • Algorithm (1)
      • Conference (1)
      • Retrospective (3)
    • Book (0)
      • Self-Development (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • node.js
  • 네스트
  • 디프만
  • 타입스크립트
  • dynamic programming
  • TypeScript
  • k8s
  • Express
  • 인프런
  • nestjs
  • 파이썬
  • N과 M
  • Kubernetes
  • Toy Project
  • baekjoon
  • 익스프레스
  • 다이나믹 프로그래밍
  • 백준
  • 함수형 프로그래밍
  • 자바스크립트
  • Omuk
  • 토이프로젝트
  • 노드
  • 인프런X디프만
  • 쿠버네티스
  • 오먹
  • GREEDY
  • python
  • 백트래킹
  • backtracking

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
턴태
[Python] 15655 N과 M(6)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.