728x90
풀이 1
itertools의 permutation을 사용한 풀이이다.
우선 arr에 입력값을 받고 arr의 첫 번째 원소를 pop(0)을 통해 빼준다.
그리고 permutation을 통해 모든 경우의 수를 arr_p에 넣어주고 그중 정렬되어있는 리스트들만 print 해주면 된다.
하지만 permutaion을 사용하였기 때문에 시간복잡도가 O(n!)여서 아슬아슬하게 통과하게 된다.
import sys
from itertools import permutations
input = sys.stdin.readline
while True:
arr = list(map(int, input().split()))
n = arr.pop(0)
arr_p = list(permutations(arr, 6))
for case in arr_p:
case = list(case)
if case != sorted(case):
continue
elif case == sorted(case):
print(*case)
continue
print()
if n == 0:
break
풀이 2
DFS를 이용한 풀이이다. (풀이 출처 : 링크)
8 1 2 3 5 8 13 21 34 를 입력받았다면
del arr[0]을 통해 첫 번째를 삭제해주고 arr에는 1, 2, 3, 5, 8, 13, 21, 34가 담긴다.
dfs함수를 처음 쓰게 되면
dp배열에는 차례대로 1, 2, 3, 5, 8, 13이 담기게 된다.
depth가 6이기때문에 출력을 해주고 return 하여 이전 함수로 돌아가게 된다.
for 문의 i는 증가한 상태이므로 1, 2, 3, 5, 8, 21이 담기게 된다.
이렇게 순서대로 dfs를 이용하여 풀어준다.
이렇게 풀 경우 시간이 풀이 1보다 5배정도 빨라지는 것을 확인할 수 있었다.
import sys
input = sys.stdin.readline
dp = [0 for i in range(13)]
def dfs(start, depth):
if depth == 6:
for i in range(6):
print(dp[i], end=' ')
print()
return
for i in range(start, len(arr)):
dp[depth] = arr[i]
dfs(i + 1, depth + 1)
while True:
arr = list(map(int, input().split()))
if arr[0] == 0:
break
del arr[0]
dfs(0, 0)
print()
'Algorithm' 카테고리의 다른 글
리트코드(LeetCode) 49번 그룹 애너그램(Group Anagrams) (0) | 2021.09.09 |
---|---|
리트코드(LeetCode) 819번 가장 흔한 단어(Most Common Word) (0) | 2021.09.08 |
백준 알고리즘 파이썬(Python) 10819번 차이를 최대로 (0) | 2021.09.05 |
리트코드(LeetCode) 937번 로그 파일 재정렬(Reorder Data in Log Files) (0) | 2021.09.02 |
리트코드(LeetCode) 125번 Valid Palindrome (유효한 팬린드롬) (0) | 2021.08.31 |