일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 티스토리챌린지
- Java
- Python
- 파이썬문법
- Provider
- disposableeffect
- 자바set
- compose
- 프로그래머스
- 백준파이썬
- composelifecycle
- 백준
- 문자열
- nullpointerexception방지
- 자바
- Kotlin
- 파이썬
- 배열
- Hilt
- 자료형
- list
- programmers
- 자바리스트정렬
- ContentProvider
- jetpack
- android
- Dependency
- 리스트
- filternotnull()
- 오블완
- Today
- Total
study gomi
[백준/baekjoon] 28278번 스택2 (파이썬) 본문
내 제출
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함수로 결과를 출력할 때 문자열로 결합하여 출력하는 것이 더 효율적이라고 한다.
- 입력 최적화: Python에서는 input() 함수 대신 sys.stdin.readline()을 사용하는 것이 입력을 더 빠르게 처리할 수 있다. 특히 여러 줄의 입력을 받을 때 이 방법이 유용.
- 출력 최적화: 여러 줄에 걸쳐 출력할 때, 각 출력마다 print() 함수를 호출하는 것보다는 결과를 문자열로 결합하여 한 번에 출력하는 것이 더 효율적일 수 있다. 근데 입력 최적화후에 바로 정답 처리가 돼서 굳이 출력을 이런 식으로 변경하지는 않았다. 아무튼..
- 예를 들어서,
- 한 줄 한 줄 바로바로 출력하는 것이 아니라
- 결과를 담을 output 리스트를 미리 선언
- print 부분을 output.append(stack.pop() if stack else -1) 이런 식으로 output에 당장의 결과를 저장하게 함.
- 반복문이 끝나고 output의 내용물을 출력하게끔 함.
- 아무튼 주저리 주저리 길었는데 아래와 같이 코드를 수정했더니 정답처리가 되었다.
# 추가
import sys
# 시간 초과 코드
# x = list(map(int, input().split())
# 변경 코드
x = list(map(int, sys.stdin.readline().split()))
채점 결과
[백준] C++ cin, cout 입출력 속도 빠르게 하는 법
나는 C++을 이용해서 백준 문제를 풀고있다. 그런데 풀다가 이상한 광경을 목격했다. 다른 사람의 코드를 봤는데, 분명 나와 코드 구조는 같은데 실행 시간이 훨씬 빨랐다. 뭐가 다른걸까 비교해
velog.io
'Practice > Baekjoon' 카테고리의 다른 글
[백준/baekjoon] 12789번 도키도키 간식드리미 (파이썬) (2) | 2024.01.14 |
---|---|
[백준/baekjoon] 4949번 균형 잡힌 세상 (파이썬) (0) | 2024.01.14 |
[백준/baekjoon] 13909번 창문 닫기 (파이썬) (1) | 2024.01.11 |
[백준/baekjoon] 17103번 골드바흐 파티션 (파이썬) (1) | 2024.01.11 |
[백준/baekjoon] 4134번 다음 소수 (파이썬/자세한 풀이) (2) | 2024.01.10 |