알고리즘 공부(C++)

백준 15649 N과 M(1)

혀니리리 2022. 8. 24. 15:01
728x90

15649번: N과 M (1) (acmicpc.net)

 

15649번: N과 M (1)

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

www.acmicpc.net

첫 백트래킹(DFS) 문제였다.

처음이어서 답을 참고했지만 다음부턴 스스로 풀도록 하자.......

N,M = map(int, input().split())
visited = [False] * N
lst = []
def dfs(depth):
    if depth == M:
        print(' '.join(map(str, lst)))
        return
    for i in range(N):
        if not visited[i]:
            visited[i] = True
            lst.append(i + 1)
            dfs(depth + 1)
            visited[i] = False
            lst.pop()
dfs(0)

<새로 안 상식>

1.map(str, lst) => map함수는 여러 요소들을 한 번에 형식 변환을 하기 위해 쓰이는 함수로

이렇게 썼을 때는 lst의 모든 요소를 한 번에 str로 바꾼다는 뜻이다.

2.' '.join(lst) : lst의 요소들을 공백을 통해 합한다는 뜻이다.

3.DFS의 기본 구조

 - 1.depth의 길이에 해당하는 visited라는 'False' 요소로 이루어진 리스트를 만든다.

 - 2.dfs라는 함수는 0부터 시작하여 depth까지 내려가는데, depth에 도달하면 print로 출력하고 return 한다.

 - 3.depth에 도달하기 전에는 for문으로 한 타임에 출력해야할 길이만큼 for문을 돌린다.

       (이 과정에서 깊이 우선 탐색이 이루어짐)

     * 한 번 for문이 돌아갈 때마다 해당하는 visited 의 index가 true로 바뀌며 lst에도 값이 추가된다.

     * 그 다음에 재귀로 dfs(depth + 1)로 들어간다. 

     * 재귀문 실행 뒤에는 빠져나왔기 때문에 빠져나온 만큼 visited를 false로 다시 바꿔주고, lst도 참고할 시 pop으로 마찬가지로 한 요소를 꺼내줘야 함

728x90

'알고리즘 공부(C++)' 카테고리의 다른 글

2798 블랙잭  (0) 2022.08.24
백준 1010 다리놓기  (0) 2022.08.24
1018 체스판 다시 칠하기  (0) 2022.08.22
2477 참외밭  (0) 2022.08.18
1181 단어 정렬  (0) 2022.08.17