PS

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

young604 2023. 3. 8. 01:01
728x90

문제 링크 : https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

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

www.acmicpc.net

thinking

탈출조건 > 정답 리스트와  m의 길이가 같을때 탈출하며 출력 가지치기!

반복 > 수열 출력하는 부분

방문처리 > for문의 i로 정답 리스트에 있는 지 확인 > 있으면 중복되는 경우이므로 contiue로 for문 건너뛰기

n, m = map(int, input().split()) #n, m입력
ans = [] #정답 출력 list

def n_m():
    if len(ans) == m: #재귀 탈출 조건
        print(' '.join(map(str, ans))) #list를 str로 합쳐 출력 
        return

    for i in range(1, n + 1):
        if i in ans:  # 방문(숫자가 중복) 했을 경우 for문 전체 건너뜀
            continue
        ans.append(i)
        n_m()  # 다음 자리로 넘어가기
        ans.pop() #다음을 위해서 비우기

n_m()

백트래킹인지 미친인지...

너무 어려워서 수련의 심정으로 n과 m 시리즈 격파할 예정이다.

백트래킹은 DFS과 동일하나 가지치기를 한다는 것에서 차이점이 있다.

모든 경우의 수를 탐색(완전탐색)하지 않고 조건을 걸어서 유망하지 않는 경우에는 탐색을 중지하고 이전 노드로 돌아간다.

문제 잘 읽고 1. 탈출조건 2. 반복되는 곳 3. 방문처리 잘 하기!

728x90