알고리즘(Python)/백준

210525 [백준] AC(5430) / 구간합4(11659) / 수강신청(13414)

제이드Jade 2021. 5. 26. 13:24

 

[BOJ] 5430 - AC
# deque는 슬라이싱을 할 수 없다
# len 이용하기 전 갯수를 입력으로 받는지 여부를 잘 판단하자. len이 정확한 원소개수를 돌려주지 않을 수 있음
# 출력형식이 [,,,]이면 [, , ,]는 틀린 것이다.
# 뒤집는 연산은 시간이 많이 든다. 매번 앞 원소를 제거하는 것이므로 reverse 후 D는 맨 뒤 원소를 뽑는 것으로 대체할 수 있고 reverse는 마지막에 몰아서 처리한다.
import sys
from collections import deque

T=int(input())

for _ in range(T):
    p=list(sys.stdin.readline().strip())
    N=int(sys.stdin.readline().strip())
    xrr=deque((sys.stdin.readline().strip())[1:-1].split(','))
    if N<p.count('D'):
        print('error')
        continue
    if N==0:
        print("[]")
        continue
    
    rever=0
    for i in range(len(p)):
        if p[i]=='D':
            if rever%2==0:
                xrr.popleft()
            else:
                xrr.pop()
        elif p[i]=='R':
            rever+=1
    
    if rever%2==1:
        xrr.reverse() 
        
    printrr='['+','.join(xrr)+']'
    print(printrr)

[BOJ] 11659 - 구간합4

#구간들의 합을 구하는건 누적합을 이용한다! 미리 누적합을 리스트에 저장한 후 accums[j]-accums[i]로 한다!

#누적합을 편리하게 해주는 라이브러리~~~itertools.accumualte()!!

import sys
import itertools

N,M=map(int,sys.stdin.readline().split())
list_n=list(map(int,sys.stdin.readline().split()))

accums=list(itertools.accumulate(list_n))

for _ in range(M):
    i,j=map(int,sys.stdin.readline().split())
    print(accums[j-1]-accums[i-2]) if i>1 else print(accums[j-1])

[BOJ] 13414 - 수강신청

#허용되는 크기보다 적게 신청할 수도 있다. 슬라이싱 할 때 용량보다 더 크게 끝 인덱스를 잡으면 알아서 모든 값을 반환하는걸 이용하자.

import sys
K,L=map(int,input().split())
s_list={}

for i in range(L):
    sincheong=sys.stdin.readline().strip()
    s_list[sincheong]=i

for final_list in sorted(s_list.items(),key=lambda x:x[1])[:K]:
    print(final_list[0])