2019.02.27) 백준 스택 특집 - 10848, 9012, 10799 (PyPy3)

2019. 2. 27. 19:59프로그래밍(주력)/백준 문제풀이

스택은 가장 최근에 넣은(마지막에 넣은) 값을 보는 자료구조이다.

파이썬에선 별로 의미가 없지만 스택이라고 생각하고 구현하였다.


10848번

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
stack = list()
 
for i in range(int(input())):
    in_str = input().split(' ')
    # PUSH
    if in_str[0== 'push':
        stack.append(int(in_str[1]))
    # POP
    if in_str[0== 'pop':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack.pop())
    # SIZE
    if in_str[0== 'size':
        print(len(stack))
    # EMPTY
    if in_str[0== 'empty':
        if len(stack) == 0:
            print(1)
        else:
            print(0)
    # TOP
    if in_str[0== 'top':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[-1])
 
cs

9012번

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
for i in range(int(input())):
    s = input()
    stack = list()
    yes = True
    for j in range(len(s)):
        # 첫번쨰일때
        if j == 0:
            # 여는 괄호면 1 추가
            if s[0== '(':
                stack.append(1)
            # 닫는 괄호면 NO
            elif s[0== ')':
                yes = False
                break
        # 그 다음에
        else:
            # 여는 괄호면 1 추가
            if s[j] == '(':
                stack.append(1)
            # 닫는 괄호면 stack에 여는 괄호가 있으면 그걸 제거
            # 만약에 없으면 NO
            elif s[j] == ')':
                if len(stack) == 0:
                    yes = False
                    break
                elif stack[-1== 1:
                    stack.pop()
                else:
                    yes = False
                    break
    if yes and len(stack) == 0:
        print('YES')
    else:
        print('NO')
 
 
cs

10799번

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
stack = list()
 
= input()
= 0
stick = 0
 
result = 0
 
while True:
    # 만약 바로 괄호가 성립하면 지금 스틱 개수만큼 조각개수에 추가
    if n[i:i + 2== '()':
        result += stick
        # 두개를 넘어가야 하기 떄문에 +2
        i += 2
    # 만약 스틱의 시작이면
    elif n[i] == '(':
        # 스틱 개수에 1 더하고
        stick += 1
        # 조각에 스틱 처음부분이 더해지고
        result += 1
        # 스틱 시작부분을 스택에 추가
        stack.append(0)
        i += 1
    # 스틱의 끝이면
    elif n[i] == ')':
        # 스틱 개수 하나 줄어듬
        stick -= 1
        # 스틱 스택에서 제거
        stack.pop()
        i += 1
 
    if i == len(n):
        break
 
print(result)
 
cs