study gomi

[백준/baekjoon] 28278번 스택2 (파이썬) 본문

Practice/Baekjoon

[백준/baekjoon] 28278번 스택2 (파이썬)

공부하곰 2024. 1. 12. 09:25
728x90
반응형

내 제출

import sys

# 명령의 수 n
n = int(input())

# 정수를 저장하는 스택을 구현
stack = list()

for _ in range(n):
    # 해야 할 명령을 정수 형태로 입력으로 받음.
    x = list(map(int, sys.stdin.readline().split()))

    # 1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
    if x[0] == 1:
        stack.append(x[1])
    # 2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력. 없다면 -1을 대신 출력한다.
    elif x[0] == 2:
        print(stack.pop() if stack else -1)
    # 3: 스택에 들어있는 정수의 개수를 출력한다.
    elif x[0] == 3:
        print(len(stack))
    # 4: 스택이 비어있으면 1, 아니면 0을 출력한다.
    elif x[0] == 4:
        print(1 if not stack else 0)
    # 5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.
    elif x[0] == 5:
        print(stack[-1] if stack else -1)

 

시간 초과가 떴던 첫 제출 코드

- 글 길어져서 접어둠↓

더보기

# 명령의 수 n
n = int(input())

# 정수를 저장하는 스택을 구현
stack = list()

for _ in range(n):
    # 입력으로 주어지는 명령을 처리
    x = list(map(int, input().split()))

    # 1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
    if x[0] == 1:
        stack.append(x[1])
        # print('stack is ', stack)
    # 2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력. 없다면 -1을 대신 출력한다.
    elif x[0] == 2:
        print(stack.pop() if stack else -1)
        # print('stack is ', stack)
    # 3: 스택에 들어있는 정수의 개수를 출력한다.
    elif x[0] == 3:
        print(len(stack))
        # print('stack is ', stack)
    # 4: 스택이 비어있으면 1, 아니면 0을 출력한다.
    elif x[0] == 4:
        print(1 if not stack else 0)
        # print('stack is ', stack)
    # 5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.
    elif x[0] == 5:
        print(stack[-1] if stack else -1)
        # print('stack is ', stack)

- 처음에 제출했을 때 시간초과가 떴다. 오잉...?

- 제출을 pypy로 변경해서 해도 떴다.

- 어... 혹시 뭔가 연산의 시간 복잡도가 높은 게 있나...? 싶어서 찾아봤는데 그건 아닌 것 같다.

- insert연산도 없어서 O(N)짜리도 없다. append와 pop연산 정도인데 전부 O(1)짜리다.

- 모르겠어서 노래 듣고 있었는데 갑자기 예전에 c++로 백준 문제 풀 때 자주 쓰던 편법이 생각났다.

(혹시 누군가가 궁금해 할까봐 - 딱히 보러 오는 사람은 없지만- 아래 더보기에 링크를 첨부하겠음.)

- 시간 초과와 관련된 것은 반복되는 어떤 동작의 수행 속도를 줄이면 되는데 연산은 문제가 없으니 남은 건 입/출력.

- 그래서 입/출력 속도를 어케 해야겠다 싶었다.

- 찾아봤더니 sys.stdin.readline() <- 이게 있다.

- 참고로 python은 print함수로 결과를 출력할 때 문자열로 결합하여 출력하는 것이 더 효율적이라고 한다.

더보기
  1. 입력 최적화: Python에서는 input() 함수 대신 sys.stdin.readline()을 사용하는 것이 입력을 더 빠르게 처리할 수 있다. 특히 여러 줄의 입력을 받을 때 이 방법이 유용.
  2. 출력 최적화: 여러 줄에 걸쳐 출력할 때, 각 출력마다 print() 함수를 호출하는 것보다는 결과를 문자열로 결합하여 한 번에 출력하는 것이 더 효율적일 수 있다. 근데 입력 최적화후에 바로 정답 처리가 돼서 굳이 출력을 이런 식으로 변경하지는 않았다. 아무튼..
    1. 예를 들어서,
    2. 한 줄 한 줄 바로바로 출력하는 것이 아니라
    3. 결과를 담을 output 리스트를 미리 선언
    4. print 부분을 output.append(stack.pop() if stack else -1) 이런 식으로 output에 당장의 결과를 저장하게 함.
    5. 반복문이 끝나고 output의 내용물을 출력하게끔 함.

- 아무튼 주저리 주저리 길었는데 아래와 같이 코드를 수정했더니 정답처리가 되었다.

# 추가
import sys

# 시간 초과 코드
# x = list(map(int, input().split())

# 변경 코드
x = list(map(int, sys.stdin.readline().split()))

 

채점 결과

 

 

[백준] C++ cin, cout 입출력 속도 빠르게 하는 법

나는 C++을 이용해서 백준 문제를 풀고있다. 그런데 풀다가 이상한 광경을 목격했다. 다른 사람의 코드를 봤는데, 분명 나와 코드 구조는 같은데 실행 시간이 훨씬 빨랐다. 뭐가 다른걸까 비교해

velog.io

728x90
반응형