취준생의 코딩테스트 연습기

[백준] 15649번 N과 M(1) / 파이썬(python) 본문

코딩테스트/백준

[백준] 15649번 N과 M(1) / 파이썬(python)

Jiwon_C 2021. 3. 11. 23:19

# 문제 링크

www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

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

www.acmicpc.net

# 관련 알고리즘 이론

jiwon-coding.tistory.com/34

 

백트래킹 (Backtracking)

# 백트래킹 (퇴각 검색) - 길을 가다가 이 길이 아닌 것 같으면 왔던 길로 되돌아가 다른 경로로 진행 - 보통 재귀로 구현하며 조건이 맞지 않으면 종료한다. - DFS(깊이 우선 탐색) 기반 # EXAMPLE  -

jiwon-coding.tistory.com

# Soultion

DFS의 일종인 백트래킹에 대하여 공부를 한 뒤, 문제를 풀었다. (재귀함수)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n,m = list(map(int,input().split()))
 
= []
 
def dfs():
    if len(s)==m:
        print(' '.join(map(str,s)))
        return
    
    for i in range(1,n+1):
        if i not in s:
            s.append(i)
            dfs()
            s.pop()
 
dfs()
 
cs

 

3. 재귀함수를 이용하여 m개의 수열을 저장하기 위한 리스트

6. 리스트에 들어간 수열들이 m개가 되면 리스트에 들어있는 숫자들을 모두 출력하고 함수를 나온다.

10. for문을 이용하여 1부터 n까지의 숫자들을 모두 확인

11. 리스트 s 중복여부 확인

12. 중복이 아니면 숫자 i를 리스트 s에 넣기

13. 현재 s=[1]인 상태에서 다음숫자를 넣기위하여 가지치기하기(재귀함수)

  -> 만약 n=4, m=2라면 밑과 같은 형태로 진행될 것이다.

      s : [1] -> [1,2] -> [1] -> [1,3] -> [1] -> [1,4]

                  출력   pop(2)  출력   pop(3)  출력

Comments