본문 바로가기
알고리즘 풀기

[백준] 15649 N과 M python3

by 쏘야.yap 2020. 3. 14.
728x90

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

 

15649번: N과 M (1)

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

www.acmicpc.net

 

코드

N, M = map(int, input().split(" "))

check = [False] * (N+1)
result = [0] * M

def backtracking(idx):
    # 다 채우면
    if idx == M:
        # 출력하고 return
        print(" ".join(map(str, result)))
        return

    for i in range(1, N+1):
        if check[i]: # 이미 리스트에 있으면 넘어감
            continue

        # idx 위치에 원소 채우기
        check[i] = True
        result[idx] = i

        # 다음 인덱스 채우러 감
        backtracking(idx+1)

        # 갔다가 돌아오면
        # (?, ..., i, ...) 는 다 채운거니까 해제
        check[i] = False


backtracking(0)

 

 

해설

백트래킹을 활용해서 풀 수 있다.

원하는 자릿수(M) 크기의 리스트 result 를 만들고, 각 자릿수에 조건에 부합하는 원소를 넣는다.

중복해서 넣으면 안되므로 check 리스트에 그 원소가 체크 되었는지를 저장한다.

'알고리즘 풀기' 카테고리의 다른 글

[백준] 1759 암호 만들기 python3  (0) 2020.03.18
[백준] 6603 로또 python3  (0) 2020.03.14
[백준] 1238 파티 python3  (0) 2020.03.13
[백준] 3055 탈출 python3  (0) 2020.03.12