A 부서 : 200,000
...
총비용 = 200,000
B 부서 : 900,000
A 부서 : 200,000
...
총비용 = 1,100,000
B 부서 : 600,000
A 부서 : 200,000
...
총비용 = 800,000
def first():
print(1)
second()
print(-1)
def second():
print(2)
third()
print(-2)
def third():
print(3)
print('start')
first()
print('end')
그 후에
스택 영역 상태 | 현재 출력 결과 |
---|---|
first 함수 | start |
스택 영역 상태 | 현재 출력 결과 |
---|---|
second 함수 | start |
first 함수 | 1 |
스택 영역 상태 | 현재 출력 결과 |
---|---|
third 함수 | start |
second 함수 | 1 |
first 함수 | 2 |
스택 영역 상태 | 현재 출력 결과 |
---|---|
second 함수 | start |
first 함수 | 1 |
2 | |
3 |
그 다음 이동할 코드라인은 9로,
스택 영역 상태 | 현재 출력 결과 |
---|---|
first 함수 | start |
1 | |
2 | |
3 | |
-2 |
그 다음 이동할 코드라인은 4로,
스택 영역 상태 | 현재 출력 결과 |
---|---|
(비어 있음) | start |
1 | |
2 | |
3 | |
-2 | |
-1 |
마지막으로 코드라인 15에서 함수 호출이 끝났다.
스택 영역 상태 | 현재 출력 결과 |
---|---|
(비어 있음) | start |
1 | |
2 | |
3 | |
-2 | |
-1 | |
end |
class Node:
def __init__(self, data):
self.data = data
self.next = next
class Stack:
def __init__(self):
self.head = None
def is_empty(self):
if not self.head:
return True
return False
def push(self, data):
add_node = Node(data)
add_node.next = self.head
self.head = add_node
def pop(self):
if self.is_empty():
return None
ret_data = self.head.data
self.head = self.head.next
return ret_data
def peek(self):
if self.is_empty():
return None
return self.head.data
arr = []
[문제]
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.- push X : 정수 X를 스택에 넣는 연산이다. - pop : 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다. - size : 스택에 들어있는 정수의 개수를 출력한다. - empty : 스택이 비어있으면 1, 아니면 0 을 출력한다. - top : 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
[입력]
첫째 줄에 주어지는 명령의 수 N(1 <= N <= 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.[출력]
출력해야 하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
예제 입력 1 예제 출력 1 예제 입력 2 예제 출력 2 14 2 7 -1 push 1 2 pop -1 push 2 0 top 123 top 2 push 123 123 size 1 top -1 empty -1 pop -1 pop 0 top pop 1 pop pop -1 size 0 empty 3 pop push 3 empty top
import sys
n = int(sys.stdin.readline())
stack = [] # stack을 사용하기 위한 변수를 생성한다(파이선에서 스택은 리스트 [] 를 이용하여 사용할 수 있다.
for i in range(n):
command = sys.stdin.readline().split() # 해당 명령어를 한 줄씩 입력받는다.
if command[0] == 'push': # 명령어가 push라면 스택에 숫자를 넣는다(append() 함수를 사용한다).
stack.append(command[1])
elif command[0] == 'pop': # 명령어가 pop 이라면
if len(stack) == 0: # 스택의 크기가 0이라면 -1을 출력한다.
print(-1)
else: # 스택의 크기가 0이 아니라면 스택의 최상단을 출력 한 후 삭제한다.
print(stack.pop())
elif command[0] == 'size': # 명령어가 size라면 스택의 크기를 출력한다.
print(len(stack))
elif command[0] == 'empty': # 명령어가 empty라면
if len(stack) == 0: # 스택의 크기가 0이라면 1을 출력한다.
print(1)
else: # 스택의 크기가 0이 아니라면 0을 출력한다.
print(0)
elif command[0] == 'top': # 명령어가 top이라면
if len(stack) == 0: # 스택의 크기가 0이라면 -1을 출력한다.
print(-1)
else: # 스택의 크기가 0이 아니라면 스택의 최상단을 출력한다.
print(stack[-1])
[문제]
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠박대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저의 배치는 다음 조건을 만족한다.- 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다. : 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되 끝점은 겹치지 않도록 놓는다. - 각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다. - 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.
아래 그림은 위 조건을 만족하는 예를 보여준다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향이다.
이러한 레이저의 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.1. 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍'()'으로 표현된다. 또한 모든'()'는 반드시 레이저를 표현한다. 2. 쇠막대기의 왼쪽 끝은 여는 괄호 '('로, 오른쪽 끝은 닫힌 괄호 ')'로 표현된다.
위 예의 괄호 표현은 그림 위에 주어져 있다.
쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.
쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오.
[입력]
한 줄에 쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 공백없이 주어진다. 괄호 문자의 개수는 최대 100,000이다.[출력]
잘려진 조각의 총 개수를 나타내는 정수를 한 줄에 출력한다.
예제 입력 1 예제 출력 1 ( ) ( ( ( ( ) ( ) ) ( ( ) ) ( ) ) ) ( ( ) ) 17
예제 입력 2 예제 출력 ( ( ( ( ) ( ( ) ( ) ) ) ( ( ) ) ( ) ) ) ( ( ) ( ) ) 24
붙어있는 괄호 '()' : 레이저를 발사하여 현재 위치에서 쇠막대기를 자른다.
붙어있지 않는 괄호 '(' : 쇠막대기가 새로 생성되는 위치이다.
붙어있지 않는 괄호 ')' : 쇠막대기가 종료되는 위치이다.
'(((' 쇠막대기가 3개 생성된 후
'()' 레이저를 발사하면 쇠막대기의 총 개수는 3이 추가되고,
'() 레이저를 발사하면 쇠막대기의 총 개수는 3이 추가되고,
')' 쇠막대기가 종료될 때 총 개수는 1이 추가된다.
')' 쇠막대기가 종료될 때 총 개수는 1이 추가된다.
')' 쇠막대기가 종료될 때 총 개수는 1이 추가된다.
1. '('를 만날 때마다 스택에 '('를 추가한다(쇠막대기의 개수를 추가하기 위해).
2. 스택의 최상단이 '('이고, ')'를 만난다면 스택의 크기만큼 총 개수에 추가한다(레이저를 발사하면 현재 쇠막대기의
개수만큼 총 개수가 증가하기 때문이다).
3. ')'를 만난다면 총 개수에 1을 추가한다(쇠막대기가 종료되면 총 개수는 1이 증가하기 때문이다).
1. 레이저를 발사하면 현재 어딘가에 쌓인 쇠막대기만큼 총 개수가 증가하고
2. 어딘가에 쌓는 시점은 '('를 만났을 때이며
3. 어딘가에 쌓은 것을 없애는 시점은 ')'를 만났을 때다.
galho = input()
stack = []
answer = 0
for i in range(len(galho)):
if galho[i] == '(': # '('를 만날 때마다 스택에 '('를 추가한다.
stack.append(galho[i])
else:
if galho[i-1] == '(': # 스택의 최상단이 '('이고, ')'를 만난다면 스택의 크기만큼 총 개수에 추가한다.
stack.pop()
answer += len(stack)
else: # ')'를 만난다면 총 개수에 1을 추가한다.
stack.pop()
answer += 1
print(answer)
[문제]
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
[입력]
첫째 줄에 N과 K가 주어진다. (1 <= K <= N <= 500,000)
둘째 줄에 N자리 숫자가 주어진다. 이 수는 0으로 시작하지 않는다.
[출력]
입력으로 주어진 숫자에서 K개를 지웠을 때 얻을 수 있는 가장 큰 수를 출력한다.
예제 입력 1 예제 출력 1 4 2 94 1924
예제 입력 2 예제 출력 2 7 3 3234 1231234
예제 입력 3 예제 출력 3 10 4 775841 4177252841
for num in number:
if answer[-1] > ni,"
del answer[-1]
n, k = map(int, input().split()) # n, k 그리고 n개의 수를 입력받는다.
number = list(input())
answer = [] # 스택으로 이용할 answer 변수를 생성한다.
cnt = k
for num in number: # for문을 통해 number 배열을 순회한다.
# answer 스택이 비어있지 않고 지울 수 있는 횟수 k가 남아있고, answer의 마지막 값이 num보다 작다면
# answer의 마지막 값을 지운다.
while answer and cnt > 0 and answer[-1] < num:
del answer[-1]
cnt -= 1
answer.append(num) # 그 후 현재 순회 중인 값 num을 answer에 추가한다.
print(''.join(answer[:n-k])) # 정답을 출력한다.