본문 바로가기
알고리즘 테스트/백준

백준 15649 : N과 M (1) (파이썬)

by codeyaki 2022. 2. 1.
반응형

N과 M (1)

시간 제한 메모리 제한 제출 정답  맞힌 사람 정답 비율
1 초 512 MB 50418 30965 20654 60.574%

문제

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

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

입력

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

출력

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

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

예제 입력 1

3 1

예제 출력 1

1
2
3

예제 입력 2

4 2

예제 출력 2

1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3

예제 입력 3 

4 4

예제 출력 3 

1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1

코드1

# https://www.acmicpc.net/problem/15649
# https://teching.tistory.com/
import itertools

n, m = map(int,input().split())
nums = [i+1 for i in range(n)]
for ln in list(itertools.permutations(nums,m)):
    for i in range(m):
        print(ln[i],end= ' ')
    print('')

코드 2

# https://www.acmicpc.net/problem/15649
# https://teching.tistory.com/
def bts(n, m, visited = [], k=0):
    if len(visited) == m:
        print(' '.join(map(str,visited)))
        return
    for i in range(1, n+1):
        if i in visited: continue
        visited.append(i)
        bts(n,m,visited,i)
        visited.pop()


n, m = map(int, input().split())
bts(n,m)

해설

처음에는 문제만 보고 단순하게 순열을 구해서 출력해주었다.

하지만 백트래킹을 이용하여 풀이해보고 싶어서 백트래킹을 이용하여 풀었다.

백트래킹에 대해서 간단하게 정리를 해보자면

백트래킹 (Backtracking) :

  • 모든 경우의 수를 전부 고려하는 알고리즘.
  • 상태 공간을 트리로 나타낼 수 있을 때 적합한 방식.
  • DFS, BFS와 기본적인 방법은 같으나 경로를 탐색하기 이전에 조건을 추가해 불필요한 경로를 사전에 쳐내는 것이다.
    반복문의 회수를 줄일 수 있음.

DFS (깊이 우선 탐색) :

  • 트리나 그래프에서 한 루트로 탐색하다가 특정 상황에서 최대한 깊숙이 들어가서 확인한 뒤 다시 돌아가 다른 루트로 탐색하는 방식.
  • 일반적으로 재귀 함수로 구현. (스택으로 구현하기도 함)
  • 장점 :
    현 경로상의 노드들만을 기억하면 되므로 저장 공간의 수요가 비교적 적다.
    목표 노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.
  • 단점 :
    해가 없는 경로에 깊이 빠질 가능성이 있음. (해결 방법: 임의 깊이까지만 탐색하도록 설정)
    얻어진 해가 최단 경로가 된다는 보장이 없음.

BFS (너비 우선 탐색) :

  • 모든 경로를 동시에 진행하여 탐색하는 방식.
  • 장점 :
    최단 경로를 찾을 수 있다.
  • 단점 : 
    경로가 매우 긴 경우에는 저장 공간의 수요가 비교적 많다.
    해가 없는 경우 해도 못 찾고 끝내지도 못할 수 있음.
반응형