2019.03.21) 소프트웨어 마에스트로 마지막 스퍼트 2편(dp, 삼분탐색) - 1766, 2169, 2504, 2512, 8986 (PyPy3)

2019. 3. 21. 22:10프로그래밍(주력)/백준 문제풀이

위상정렬 복습이랑 삼분탐색까지 익혔다


1766번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
N, M = map(int, input().split())
 
graph = {i: list() for i in range(1, N + 1)}
count = {i: 0 for i in range(1, N + 1)}
 
for _ in range(M):
    a, b = map(int, input().split())
    graph[a].append(b)
    count[b] += 1
 
queue = list()
for i in range(1, N + 1):
    if count[i] == 0:
        queue.append(i)
 
result = ''
for _ in range(N):
    queue.sort()
    now = queue.pop(0)
    result += str(now) + ' '
    for nxt in graph[now]:
        count[nxt] -= 1
        if count[nxt] == 0:
            queue.append(nxt)
 
print(result)
cs

2169번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
N, M = map(int, input().split())
 
dp = list()
ma = list()
 
dp.append([0 for i in range(M)])
 
for _ in range(N):
    ma.append(list(map(int, input().split())))
 
 
dp = list()
 
tmp = [ma[0][0]]
for i in range(M - 1):
    tmp.append(tmp[i] + ma[0][i + 1])
 
dp.append(tmp)
 
for i in range(1, N):
    tmp = [dp[i - 1][j] + ma[i][j] for j in range(M)]
    tmp1 = [tmp[0]]
    for j in range(M - 1):
        tmp1.append(max(tmp1[j] + ma[i][j + 1], tmp[j + 1]))
    tmp2 = [0* (M - 1+ [tmp[-1]]
    for j in range(M - 10-1):
        tmp2[j - 1= max(tmp2[j] + ma[i][j - 1], tmp[j - 1])
    for j in range(M):
        tmp[j] = max(tmp1[j], tmp2[j])
    dp.append(tmp)
 
print(dp[-1][-1])
cs

2504번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
st = input()
 
stack = list()
 
 
= 0
result = 0
tmp_result = 1
= False
before = ''
while i < len(st):
    if st[i] == '(':
        stack.append(2)
    if st[i] == ')':
        if len(stack) == 0:
            f = True
            break
        s = stack.pop()
 
        if s == 2:
            if before == '(':
                tmp = s
                for z in stack:
                    tmp *= z
 
                result += tmp
        else:
            f = True
            break
 
    if st[i] == '[':
        stack.append(3)
    if st[i] == ']':
        if len(stack) == 0:
            f = True
            break
        s = stack.pop()
 
        if s == 3:
            if before == '[':
                tmp = s
                for z in stack:
                    tmp *= z
 
                result += tmp
        else:
            f = True
            break
    before = st[i]
    i += 1
 
if len(stack) != 0 or f:
    print(0)
else:
    print(result)
cs

2512번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
= int(input())
 
li = list(map(int, input().split()))
 
= int(input())
 
li.sort()
 
left = 1
 
right = li[-1]
 
re = 0
 
 
while left <= right:
    mid = (left + right) // 2
    tmp = 0
    for i in li:
        if i < mid:
            tmp += i
        else:
            tmp += mid
 
    if tmp <= S:
        re = mid
        left = mid + 1
 
    if tmp > S:
        right = mid - 1
 
print(re)
cs

8986번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
= int(input())
 
li = list(map(int, input().split()))
 
left = 1
 
right = int(1e9)
 
re = int(1e18)
 
while right - left > 2:
    pos1 = (left * 2 + right) // 3
    pos2 = (left + right * 2// 3
 
    tmp1 = 0
    tmp2 = 0
    for i in range(N):
        tmp1 += abs(li[i] - (li[0+ pos1 * i))
        tmp2 += abs(li[i] - (li[0+ pos2 * i))
    re = min(re, tmp1, tmp2)
    if tmp1 == tmp2:
        left = pos1
        right = pos2
    elif tmp1 > tmp2:
        left = pos1 + 1
    else:
        right = pos2
    # print()
 
print(re)
cs