import sys
count = int(input())
number = list()
for i inrange(count):
number.append(int(sys.stdin.readline()))
number.sort()
for i inrange(count):
print(number[i])
import sys
n = int(input())
l = []
for i inrange(n):
l.append(int(sys.stdin.readline()))
for i insorted(l):
sys.stdout.write(str(i)+'\n')
리뷰
파이썬에서, 많은 입력을 받는 코드는 무조건적으로 sys.stdin.readline()을 쓰는 것이 빠르다. 파이썬의 sort()나 sorted()는 시간복잡도O(nlog(n))으로 가장 빠른 편에 속한다. sorted()는 sort()와 다르게 정렬된 리스트를 반환하는 함수이다.
11399 ATM
나의 풀이
n = int(input())
m = list(map(int, input().split()))
temp = sum = 0for i insorted(m):
temp = temp + i
sum += temp
print(sum)
n = int(input())
s = list(map(int, input().split()))
num = 0
s.sort()
for i inrange(n):
for j inrange(i + 1):
num += s[j]
print(num)
리뷰
파이썬의 정렬은 오름차순이다. cf) 내림차순은 reverse=True 인자를 사용
9012 괄호
나의 풀이
t = int(input())
result = list()
for _ inrange(t):
stack = list()
s = input()
for i in s:
if i == '(':
stack.append('(')
elif i == ')':
ifnot stack:
stack.append(')')
else:
if stack.pop() == '(':
passelse :
stack.append(')')
ifnot stack:
result.append('YES')
else:
result.append('NO')
for i in result:
print(i)
나타난 '('를 스택에 쌓는다.
그 뒤에 ')'가 나타나면 '('를 pop하여 없엔다.
그 전에 ')'가 나타나면 ')'를 스택에 쌓는다.
마지막으로 ')'가 스택에 남아있으면 맞지않는 괄호이므로 NO
스택이 비어있다면 '('가 전부 pop되고, 그 뒤에 '('나 ')'가 더 이상 나오지 않은 상태이므로 YES
이분의 코드는 '('가 없이 ')'가 먼저 나오면 NO를 출력 후 끊어지는 코드로 더 효율적이다.
T = int(input())
for i inrange(T):
stack = []
a=input()
for j in a:
if j == '(':
stack.append(j)
elif j == ')':
if stack:
stack.pop()
else: # 스택에 괄호가 없을경우 NOprint("NO")
breakelse: # break문으로 끊기지 않고 수행됬을경우 수행한다ifnot stack: # break문으로 안끊기고 스택이 비어있다면 괄호가 다 맞는거다.print("YES")
else: # break안 걸렸더라도 스택에 괄호가 들어있다면 NO이다.print("NO")
리뷰
파이썬에서 문자열을 문자 하나씩 검사할때는 for문을 적극 이용하자. 파이썬의 list는 pop을 지원하기 때문에 스택처럼 이용가능하다.
10845 큐
나의 풀이
import sys
from collections import deque
n = int(input())
queue = deque()
for _ inrange(n):
command = list()
command = sys.stdin.readline().split()
if command[0] == 'push':
queue.append(command[1])
elif command[0] == 'pop':
if queue:
print(queue.popleft())
else :
print(-1)
elif command[0] == 'size':
print(len(queue))
elif command[0] == 'empty':
if queue:
print(0)
else:
print(1)
elif command[0] == 'front':
if queue:
print(queue[0])
else:
print(-1)
elif command[0] == 'back':
if queue:
print(queue[len(queue)-1])
else:
print(-1)
많은 입력을 받는 문제이므로 sys.stdin.readline().split()을 사용
deque도 list와 같이 len() 함수를 사용하거나, if deque로 null상태를 검사할 수 있다.
더 나은 풀이
다른 분들의 풀이에서는 deque가 아닌 list로 구현하였다. push부분을 insert(0, 정수값)으로 주던가, pop부분을 list.pop(0)으로 주어주면 list로 구현가능하다.
리뷰
아래- deque이용/ 위- list이용
deque의 popleft()가 속도가 O(1)이고, list의 pop(0)이 O(n)이라 deque가 더 빠를 줄 알았다. deque의 양 끝 인덱스 접근은 O(1)이지만 중간 데이터 접근은 O(N)이라고 한다. front와 back은 양 끝 인덱스 접근이지만 pop으로 접근하는 것이 아니라 O(N)만큼 걸리는걸까? 이부분에선 아직 의문이다. [Python] deque의 접근 연산 시간 복잡도 (velog.io) 이 분의 글을 참고하자면, 인덱스 접근은 리스트가 더 빠르므로 인덱스 접근이 많은 코드는 오히려 리스트를 쓰도록 하자.