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) )'코딩테스트 파이썬 > hackerrank' 카테고리의 다른 글
| Happy Ladybugs (0) | 2024.10.14 |
|---|---|
| Encryption (0) | 2024.10.11 |
| Cavity Map (0) | 2024.10.08 |
| Fair Rations (0) | 2024.10.07 |
| Cut the sticks (0) | 2024.09.23 |