본문 바로가기
Algorithm/백준

[Python] 백준 15654번 - N과 M (5)

by 애기 개발자 2023. 2. 13.
반응형

https://www.acmicpc.net/problem/15654

 

15654번: N과 M (5)

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

www.acmicpc.net

 

혼자 힘으로 풀었는가? O

알고리즘 분류
 - 백트래킹

문제

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

  • N개의 자연수 중에서 M개를 고른 수열

입력

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

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

출력

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

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

 

 


2023.02.10 - [Algorithm/백준] - [Python] 백준 15650번 - N과 M (2)

 

[Python] 백준 15650번 - N과 M (2)

https://www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

baby-dev.tistory.com

 

2023.02.11 - [Algorithm/백준] - [Python] 백준 15652번 - N과 M (4)

 

[Python] 백준 15652번 - N과 M (4)

https://www.acmicpc.net/problem/15652 15652번: N과 M (4) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

baby-dev.tistory.com

 

앞선 문제들과 비슷한 유형이다.

 

이번에 다른점은 나오는 숫자가 1부터 시작이 아닌 특정 숫자가 주어진다는 점이며

 

특정 숫자로부터 길이만큼의 끝까지가 아닌

 

특정 숫자를 제외한 처음부터 주어진 길이까지이다.

 

4 2
1 7 8 9

위를 예로 들면

 

처음엔 1을 제외한

1 7
1 8
1 9

그 다음엔 7을 제외한

7 1
7 8
7 9

위와 같은 방식이다.

 

import sys
input = sys.stdin.readline
from collections import deque
n, m = map(int, input().split())
data = list(map(int, input().split()))
data.sort()
visited = [0] * n
stack = []
def dfs(start, index):
  if index == m:
    for i in range(m):
      print(stack[i], end=' ')
    print()
    return
  for i in range(0, n):
    if data[i] not in stack:
      stack.append(data[i])
      dfs(i+1, index+1)
      stack.pop()

dfs(0, 0)

스택에 넣어서 스택에 해당 수가 있는지 찾는 방식으로 문제를 해결했다.

 

푸는 방식은 앞선 방식과 비슷하나

 

in 으로 리스트를 뒤져보기 때문에 처음부터 끝까지 뒤져보기 때문에 속도측면에선 비효율적인 정답이다.

반응형

댓글