[Python]알고리즘/백준

[DFS/BFS/완전탐색] ▲ 10974번 - 모든 순열(DFS, 완전 탐색)

HSY_mumu 2022. 4. 12. 14:27
728x90

[백준] 10974번 - 모든 순열

풀이 시간: 20~30분 이내

라이브러리를 사용하지 않는다면 시간이 좀 걸린 문제로 추후 복습 필요!

(풀이1) permutaions 라이브러리 이용

1) 문제 해결 아이디어

파이썬에서 순열을 반환해주는 라이브러리를 이용하면 쉽게 풀 수 있다. 

 

<순열을 출력하는 방법>

1. '구분자'.join(리스트) 이용

join을 이용하면 리스트의 문자들을 구분자로 이어붙여 문자열로 출력할 수 있다.

다만, graph에 담긴 원소들은 문자가 아니라 숫자이므로 map을 이용하여 int→str 형변환한 후 join함수를 사용해야 한다!

2. 2중 for문 이용

 

2) 소스코드

from itertools import permutations

n = int(input())
graph = [i for i in range(1, n + 1)]  # 1 ~ n 

for i in permutations(graph):
  print(' '.join(map(str, i)))
'''
for i in permutations(graph):
  for j in i:
    print(j, end= " ")
  print()
'''

(풀이2) DFS를 이용한 백트래킹

1) 문제 해결 아이디어

하지만 라이브러리를 사용하지 않고 푸는 방법 또한 알고 있을 필요가 있기 때문에 이러한 풀이로도 꼭 풀어봐야 한다. 막상 라이브러리를 사용하지 않고 풀려고 하니 답답했다.

 

깊이 0으로 dfs 호출하고 깊이(depth)가 n이 되면 순열(temp)값을 출력시키고 종료하는 방식이다.

여기서 중요한 점은 1 ~ n 에 대해 for문을 돌면서 현재 선택한 값(i)가 순열(temp)에 없다면 숫자를 넣어주고 (깊이 + 1)로 dfs를 호출한 후 사용한 숫자(i)를 다시 꺼내 주어야 한다는 것이다.

 

2) 소스코드

n = int(input())
temp = []

# DFS
def dfs(depth):
  # 깊이가 n이 되면 종료
  if depth == n:
    print(*temp)
    return

  for i in range(1, n + 1):
    # 아직 사용하지 않은 숫자면
    if i not in temp:
      temp.append(i)  # 사용할 숫자 넣기
      dfs(depth + 1)    # 다음 깊이로 dfs 호출
      temp.pop()      # 사용한 숫자 꺼내기
dfs(0)

[참고] https://honggom.tistory.com/115

 

[백준] 10974번 문제 (모든 순열) 파이썬(Python) 풀이

https://www.acmicpc.net/problem/10974 10974번: 모든 순열 N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오. www.acmicpc.net n = int(input()) temp = [] def..

honggom.tistory.com

 

728x90