개발 마라톤

22.10.23 / 정렬 2문제, 스택, 큐 본문

--- Coding test ---/Baekjoon

22.10.23 / 정렬 2문제, 스택, 큐

망__고 2022. 10. 24. 03:15
2751 수 정렬하기 2

나의 풀이

import sys

count = int(input())
number = list()
for i in range(count):
    number.append(int(sys.stdin.readline()))
number.sort()
for i in range(count):
    print(number[i])

더 나은 풀이

[Python] 백준 2751번 수 정렬하기 2 (tistory.com)

import sys

n = int(input())
l = []
for i in range(n):
	l.append(int(sys.stdin.readline()))
for i in sorted(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 = 0
for i in sorted(m):
    temp = temp + i
    sum += temp
print(sum)

더 나은 풀이

[백준] 11399번(python 파이썬) :: 깨지고 부서져라 (tistory.com)

변수를 한 개 줄이고 싶다면 이중 for문을 사용하는 방법도 있다.

n = int(input())
s = list(map(int, input().split()))
num = 0
s.sort()
for i in range(n):
    for j in range(i + 1):
        num += s[j]
print(num)

리뷰

파이썬의 정렬은 오름차순이다.
cf) 내림차순은 reverse=True 인자를 사용

 

9012 괄호

나의 풀이

t = int(input())
result = list()
for _ in range(t):
    stack = list()
    s = input()
    for i in s:
        if i == '(':
            stack.append('(')
        elif i == ')':
            if not stack:
                stack.append(')')
            else:
                if stack.pop() == '(':
                    pass
                else :
                    stack.append(')')
    if not stack:
        result.append('YES')
    else:
        result.append('NO')
for i in result:
    print(i)

나타난 '('를 스택에 쌓는다.

그 뒤에 ')'가 나타나면 '('를 pop하여 없엔다.

그 전에 ')'가 나타나면 ')'를 스택에 쌓는다.

마지막으로 ')'가 스택에 남아있으면 맞지않는 괄호이므로 NO

스택이 비어있다면 '('가 전부 pop되고, 그 뒤에 '('나 ')'가 더 이상 나오지 않은 상태이므로 YES

 

더 나은 풀이

[백준] 9012번 괄호 (Python)dsdw (tistory.com)

나의 코드는 문자열을 모두 검사하는 것에 반해,

이분의 코드는 '('가 없이 ')'가 먼저 나오면 NO를 출력 후 끊어지는 코드로 더 효율적이다.

T = int(input())

for i in range(T):
    stack = []
    a=input()
    for j in a:
        if j == '(':
            stack.append(j)
        elif j == ')':
            if stack:
                stack.pop()
            else: # 스택에 괄호가 없을경우 NO
                print("NO")
                break
    else: # break문으로 끊기지 않고 수행됬을경우 수행한다
        if not 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 _ in range(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)
이 분의 글을 참고하자면, 인덱스 접근은 리스트가 더 빠르므로 인덱스 접근이 많은 코드는
오히려 리스트를 쓰도록 하자.

 

 

'--- Coding test --- > Baekjoon' 카테고리의 다른 글

23.03.23 / DP  (0) 2023.03.23
22.11.12 / 문자열, 백트래킹  (0) 2022.11.12
22.10.21/ DP  (0) 2022.10.21
22.10.17 / 그래프탐색  (0) 2022.10.18
22.10.14 / 구현, 그리디  (0) 2022.10.14
Comments