전체 글

728x90
반응형

 

import sys
from collections import deque

N = int(sys.stdin.readline())
queue = deque()
while True:
    b = int(sys.stdin.readline())
    if b== -1:
        break
    else:

        if b==0:
            queue.popleft()
        elif len(queue) < N:
            print(queue)
            queue.append(b)
if len(queue)>0:
    # print(len(queue))
    # print(queue)
    for i in queue:
        print(i, end = ' ')
else:
    print('empty')

1. 입력값 -1 일경우 WHILE문 BREAK

 

2. 입력값이 0일경우 buffer (queue)에 존재하는 값 popleft

 

3. elif len(queue) < N: ==> queue의 길이가 주어진 deque 공간(N=5) 보다 작아야한다. ==> 작거나 같으면 안되는 이유로는 append를 5번 수행해야하므로!

 

 

라우터 내 버퍼의 크기 (N) 이 5라 하면 ==> DEQUE 공간이 5개가 있는 것 ㅁㅁㅁㅁㅁ

 

728x90
반응형
728x90
반응형

import sys
from collections import deque

queue = deque()
N = int(sys.stdin.readline())
B =[]
for i in range(N):
    c = list(map(str, sys.stdin.readline().rstrip().split(' ')))
    
    if c[0] == 'push':
        queue.append(c[1])
    elif c[0] == 'pop':
        if len(queue) == 0:
            B.append(-1)
        else:
            B.append(queue.popleft())
    elif c[0] == 'size':
        B.append(len(queue))
    elif c[0] == 'empty' :
        if len(queue) == 0:
            B.append(1)
        else:
            B.append(0)
    elif c[0] == 'front':
        if len(queue) == 0:
            B.append(-1)
        else:
            B.append(queue[0])

    elif c[0] == 'back':
        if len(queue) == 0:
            B.append(-1)
        else:
            B.append(queue[-1])
for i in B:
    print(i)

deque() ==> 덱의 경우 

 

양 옆으로 뺄 수 있다.

popleft() 왼쪽꺼 뺄 수 있는거고 , popright() 오른쪽꺼 뺄 수 있는거다.

728x90
반응형
728x90
반응형

import sys

A = int(sys.stdin.readline())
res , res2 = [] ,[]
stack = []
first_len = 0
for i in range(A):
    res = ""
    idx =""
    res = str(sys.stdin.readline().rstrip()) #입력 : (()) ==> res = "((())"
    idx = res
    while True:
        if '()' in idx: #idx= '((())'
            B = idx.split('()') # ()를 기준으로 나눈 list 화 ['(' ,'']
            idx = ""
            for i in B: #B = ['(' , '']
                idx += i #idx = (
        else:
            break
    if idx == '':
        res2.append('YES')
    else:
        res2.append('NO')
for i in res2:
    print(i)

split() 함수의 사용에 익숙해지자!

728x90
반응형
728x90
반응형

import sys

k = int(sys.stdin.readline())
b= []
for i in range(k):
    c = int(sys.stdin.readline())
    if c==0 and len(b)>=1:
        b.pop()
    else:
        b.append(c)
print(sum(b))

==> c값으로 0 받고 b의 길이가 1이상일경우 pop() 실행

728x90
반응형
728x90
반응형

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

import sys

A = int(sys.stdin.readline())
stack = []
B = []
#스택은 LIFO 형태로 먼저들어온게 뒤에 들어가있는다. 나중에 들어온게 처음에 들어가있고.
for i in range(A):
    c = list(map(str, sys.stdin.readline().rstrip().split()))

    if c[0] == 'push':
        c[1] = int(c[1])
        stack.append(c[1])
    elif c[0] =='pop' :
        if len(stack)>=1:
            print(stack.pop())
        else:
            print(-1)
    elif c[0] == 'size':
        print(len(stack))
    elif c[0] == 'empty':
        if len(stack)>=1:
            print(0)
        else:
            print(1)
    elif c[0] == 'top':
        if len(stack)>=1:
            print(stack[-1])
        else:
            print(-1)

스택은 나중에 들어온게 뒤에 서있다.

 

pop()의 경우 뒤에꺼 먼저 뺀다. ==> LIFO(LAST IN FIRST OUT) 방식이다. 

728x90
반응형
728x90
반응형

 

import sys

A = int(sys.stdin.readline())
B=[]
for i in range(A):
    c = list(map(int,sys.stdin.readline().split()))
    B.append(c)

B = sorted(B, key = lambda x : x[0] )
C = sorted(B , key = lambda x : x[1])
print(B)
print(C)

last = 0
count = 0
for i in C:
    if i[0] >= last: #i[0] = 1 last = 0 ==> last = 4 count =1
        #i[0] = 3 last =4 X
        #i[0] = 0 last = 4 X
        #i[0] = 5 last = 4 ==> last = 5 count =2
        #
        last = i[1]
        count+=1
print(count)

 

그리디는 당장의 상황을 기준으로 확장시키는 방향으로 해결

 

 

시작시간으로 먼저 정렬을 해준 후에, 종료 시간을 기준으로 정렬을 해준다.

 

SORTED 함수를 활용하여 정렬해준다. SORTED ( B, key = lambda x : x[0] )

 

 

==> 끝나는 시간의 오름차순으로 정렬해준다. ==> 앞의 끝나는 시간(last) 이 뒤 회의의 시작 시간(i[0])보다 작거나 같다면 count 해준다. 

 

==> 정렬 해준것의 1번째 부터의 count 해주면 된다.

 

 

728x90
반응형
728x90
반응형

https://www.acmicpc.net/problem/13305

 

13305번: 주유소

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1

www.acmicpc.net

import sys

a = int(sys.stdin.readline())

b = list(map(int ,sys.stdin.readline().split()))

c = list(map(int, sys.stdin.readline().split()))

price = c[0]*b[0] #초기값
idx = c[0]
#print(idx)
for i in range(1, len(c)-1):
    #print(c[i])
    if c[i] < idx:
        # print("idx : {}".format(idx))
        idx = c[i]
        price += idx*b[i]
    else:
        price += idx*b[i]
print(price)

 

노드가 있을 때 

 

0 - 0 - 0- 0

1번째 노드의 초기값 설정을 해준다.

price = c[0] *b[0] ==> 리터당 기름값* (1번째 To 2번째 길이) 

 

for문을 통해 리터당 기름값이 싼거에 대해서 idx변수로 치환시킨다.

--> 만약 기름값이 앞에 도시보다 싸다? idx에 싼곳의 기름값 넣는다.

price 에 기름값과 도시간 거리로 가격 더하고

 

-->기름값이 앞의 도시가 싸다! idx 변환 시키지 말고 price에 기름값과 도시간 거리 곱하여 가격을 더한다.

728x90
반응형
728x90
반응형

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

 

import sys
import re

A = str(sys.stdin.readline().rstrip()) #str 타입으로 A변수에 받아온다.
c = 0
d = 0
B = A.split('-') #B리스트에 A를 슬라이싱한다. ==> -를 기준으로 나눈다
#print(bool(A.split('-')))
# print(re.split("[-, +]" , A)) #정규식 활용시 -,+ 두개의 SPLIT()으로 나눌 수 있다.

C = B[0].split('+')
C = list(map(int, C)) #데이터 타입 변환!
c +=sum(C)
if len(B)>1:
    for i in B[1:]:
        D = i.split('+')
        D = list(map(int, D))
        d+= sum(D)
print(c - d)

1. 정규식 RE 활용 ==> SPLIT() 시 여러개의 문자열로 나눌 수 있다!

re.split("[-, +]" , A)

2. 데이터 타입 변환을 원할 시 

list(map(int, C)

map함수를 활용한 list 를 쓰자!

 

3. 알고리즘 생각 

 

'-'의 크기가 가장 커야한다 ==> -를 기준으로 나누면 가로로 묶일 것들이 나누어진다! 

이걸 마이너스가 나오기 이전의 첫번째 더한값과 빼면 최소값이 나온다!

728x90
반응형

+ Recent posts