Skip to content

Commit ec24b0e

Browse files
authored
Merge pull request #779 from sAp00n/master
외발뛰기, 와일드 카드, 삼각형 위의 최대 경로
2 parents 7e780e6 + 945bc96 commit ec24b0e

File tree

3 files changed

+154
-0
lines changed

3 files changed

+154
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from sys import stdin
2+
3+
4+
def compute_sum(location):
5+
global triang_list
6+
global memo
7+
8+
line, number = location
9+
10+
if line == len(triang_list) - 1:
11+
if location in memo:
12+
return memo[location]
13+
return_val = triang_list[line][number]
14+
memo[location] = return_val
15+
# print(f'return: {return_val}')
16+
return return_val
17+
18+
if number == len(triang_list[line]):
19+
if (line + 1, number) in memo:
20+
return triang_list[line][number] + memo[(line + 1, number)]
21+
return_val = compute_sum((line + 1, number))
22+
memo[line + 1, number] = return_val
23+
# print(f'return: {return_val}')
24+
return triang_list[line][number] + return_val
25+
26+
if (line + 1, number) in memo:
27+
left_sum = memo[(line + 1, number)]
28+
else:
29+
left_sum = compute_sum((line + 1, number))
30+
memo[(line + 1, number)] = left_sum
31+
if (line + 1, number + 1) in memo:
32+
right_sum = memo[(line + 1, number + 1)]
33+
else:
34+
right_sum = compute_sum((line + 1, number + 1))
35+
memo[(line + 1, number + 1)] = right_sum
36+
return_val = triang_list[line][number] + max(left_sum, right_sum)
37+
# print(f'return: {return_val}')
38+
return return_val
39+
40+
41+
def sol():
42+
C = int(stdin.readline())
43+
for _ in range(C):
44+
n = int(stdin.readline())
45+
global triang_list
46+
global memo
47+
triang_list = []
48+
memo = {}
49+
for __ in range(n):
50+
triang_list.append(list(map(int, stdin.readline().split())))
51+
print(compute_sum((0, 0)))
52+
# print(memo)
53+
54+
55+
sol()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from sys import stdin
2+
3+
4+
def match(w_idx, s_idx):
5+
global w
6+
global s
7+
global memo
8+
w_start_idx = w_idx
9+
s_start_idx = s_idx
10+
# print(f'input_list -> {w[w_start_idx:]} matching : {s[s_start_idx:]}')
11+
12+
if (w_start_idx, s_start_idx) in memo:
13+
# print(f'in memo\nreturn_value ->{memo[(w_start_idx, s_start_idx)]}')
14+
return memo[(w_start_idx, s_start_idx)]
15+
idx = 0
16+
# print(f'start_matching at {idx} < {len(w[w_start_idx:]) - 1} or {idx} < {len(s[s_start_idx:]) - 1}')
17+
while idx < len(w[w_start_idx:]) and idx < len(s[s_start_idx:]):
18+
if w[w_start_idx + idx] == s[s_start_idx + idx] or w[w_start_idx + idx] == '?':
19+
idx += 1
20+
# print(f' list: {w[w_start_idx + idx:]} matching: {s[s_start_idx + idx:]}')
21+
continue
22+
break
23+
24+
if w_start_idx + idx == len(w) and s_start_idx + idx == len(s):
25+
memo[(w_start_idx, s_start_idx)] = True
26+
# print(f' case {w[w_start_idx + idx:]} -> {s[s_start_idx + idx:]} is True')
27+
return True
28+
29+
if len(w[w_start_idx + idx:]) >= 1 and w[w_start_idx + idx] == '*':
30+
# print(f'fst letter is "*"')
31+
for jdx in range(0, len(s[s_start_idx:]) - idx + 1):
32+
# print(f'match( {w[w_start_idx + idx + 1:]} , {s[s_start_idx + idx + jdx:]} ) ')
33+
if match(w_start_idx + idx + 1, s_start_idx + idx + jdx):
34+
memo[(w_start_idx + idx + 1, s_start_idx + idx + jdx)] = True
35+
return True
36+
memo[(w_start_idx, s_start_idx)] = False
37+
return False
38+
39+
40+
def sol():
41+
global w
42+
global s
43+
global memo
44+
w = stdin.readline().strip('\n')
45+
n = int(stdin.readline())
46+
return_li = []
47+
for __ in range(n):
48+
s = stdin.readline().strip('\n')
49+
memo = {}
50+
if match(0, 0):
51+
return_li.append(s)
52+
# print(f'memo: {memo}\n\n')
53+
return_li.sort()
54+
for li in return_li:
55+
print(li)
56+
57+
C = int(stdin.readline())
58+
for _ in range(C):
59+
sol()
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from sys import stdin
2+
3+
4+
def recursive_jump(mat, location):
5+
# print(f'cache : {cache}')
6+
if mat[location[0]][location[1]] == 0:
7+
return True
8+
if location in cache:
9+
return cache[location]
10+
current_num = mat[location[0]][location[1]]
11+
case_01, case_02 = False, False
12+
if location[0] + current_num <= len(mat) - 1:
13+
case_01 = recursive_jump(mat, (location[0] + current_num, location[1]))
14+
cache[(location[0] + current_num, location[1])] = case_01
15+
if location[1] + current_num <= len(mat) - 1:
16+
case_02 = recursive_jump(mat, (location[0], location[1] + current_num))
17+
cache[location[0], location[1] + current_num] = case_02
18+
if case_01 or case_02:
19+
return True
20+
else:
21+
return False
22+
23+
24+
def sol():
25+
n = int(stdin.readline())
26+
mat = [list(map(int, stdin.readline().split())) for _ in range(n)]
27+
'''for line in mat:
28+
print(line)'''
29+
30+
if recursive_jump(mat, (0, 0)):
31+
print('YES')
32+
else:
33+
print('NO')
34+
35+
36+
C = int(stdin.readline())
37+
38+
for _ in range(C):
39+
cache = {}
40+
sol()

0 commit comments

Comments
 (0)