코딩테스트 파이썬/hackerrank
Manasa and Stones
세용용용용
2024. 10. 10. 15:58
https://www.hackerrank.com/challenges/manasa-and-stones/problem?isFullScreen=true
Manasa and Stones | HackerRank
Calculate the possible values of the last stone where consecutive values on the stones differ by a value 'a' or a value 'b'.
www.hackerrank.com
나의 코드
#!/bin/python3
import math
import os
import random
import re
import sys
def dfs(dfs_n, a, b, now_n, end_dfs_n):
answer = set()
if dfs_n == end_dfs_n:
return {now_n}
else:
answer = answer.union(dfs(dfs_n+1, a, b, now_n+a, end_dfs_n))
answer = answer.union(dfs(dfs_n+1, a, b, now_n+b, end_dfs_n))
return answer
def stones(n, a, b):
result = dfs(0, a, b, 0, n-1)
return sorted(result)
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
T = int(input().strip())
for T_itr in range(T):
n = int(input().strip())
a = int(input().strip())
b = int(input().strip())
result = stones(n, a, b)
fptr.write(' '.join(map(str, result)))
fptr.write('\n')
fptr.close()
시간 복잡도
dfs로 접근하였기에 n 깊이 만큼 두가지 선택지를 가짐
answer = answer.union(dfs(dfs_n+1, a, b, now_n+a, end_dfs_n))
answer = answer.union(dfs(dfs_n+1, a, b, now_n+b, end_dfs_n))
즉, 지수형 시간 복잡도를 가짐 O(2**n)
수정 코드
#!/bin/python3
import math
import os
import random
import re
import sys
def stones(n, a, b):
possible_stones = set()
for i in range(n):
stone_value = i * a + (n - 1 - i) * b
possible_stones.add(stone_value)
return sorted(possible_stones)
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
T = int(input().strip())
for T_itr in range(T):
n = int(input().strip())
a = int(input().strip())
b = int(input().strip())
result = stones(n, a, b)
fptr.write(' '.join(map(str, result)))
fptr.write('\n')
fptr.close()
시간 복잡도
for i in range(n) : n 만큼 순회 하므로 ( 선형 시간 복잡도 )
return sorted(possible_stones) : 최종적으로 정렬해 return 하므로 ( 선형로그 시간 복잡도 )
해당 알고리즘 시간복잡도는 선형로그 시간 복잡도 ( O(nlogn) )