친절하게 힌트까지 있는 문제이다.

일단 문제는 굉장히 간단한데 문제는 백준의 시간 초과이다.

이전에 올린 문제 (https://gettingtoknowit.tistory.com/99)와 같이 sys를 사용해야 시간 초과가 걸리지 않는다.

 

[백준] 10828_스택 파이썬

우선 간단히 스택 구조에 대해서 정리해보자면, 스택(stack)은 LIFO(Last In First Out) 구조이다. 즉, 가장 최근에 스택에 추가한 항목이 가장 먼저 나오는 항목이 된다. 아마 C/C++로 했으면 코드가 길어

gettingtoknowit.tistory.com


코드는 다음과 같이 하면 되지만, 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
= int(sys.stdin.readline())
num_list = []
for _ in range(k):
    num = int(sys.stdin.readline())
    if num != 0:
        num_list.append(num)
    else:
        num_list.pop()
 
total = 0
for i in num_list:
    total += i
print(total)
cs

 

위의 코드를 sum으로 더 간단하게 만드는 것 또한 가능하다.

1
2
3
4
5
6
7
8
9
import sys
= int(sys.stdin.readline())
num_list = []
for _ in range(k):
    num = int(sys.stdin.readline())
    if num != 0:
        num_list.append(num)
    else:
        num_list.pop()
print(sum(num_list))
cs

 

 

문제 출처: https://www.acmicpc.net/problem/10773

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net


input()을 통해서 풀어도 되긴 하지만, 백준의 채점 프로그램으로 인해서 input()을 시간초과가 계속 나오게 된다.

이럴 때는 sys.stdin.readline()를 사용해야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
 
for _ in range(3):
    N = int(sys.stdin.readline())
    sum = 0
    for i in range(N):
       num = int(sys.stdin.readline())
       sum = sum + num
    
    if sum > 0:
        print("+")
    elif sum < 0:
        print("-")
    else:
        print("0")
cs

 

출처: https://www.acmicpc.net/problem/1247

 

1247번: 부호

총 3개의 테스트 셋이 주어진다. 각 테스트 셋의 첫째 줄에는 N(1≤N≤100,000)이 주어지고, 둘째 줄부터 N개의 줄에 걸쳐 각 정수가 주어진다. 주어지는 정수의 절댓값은 9223372036854775807보다 작거나

www.acmicpc.net

 

이 문제의 경우 input()을 사용할 경우 계속 시간초과의 문제가 발생하였다.

먼저 문제는 다음과 같다.


주어진 입출력 예제가 빈약한데, 간단히 말해서 반복할 때마다 숫자를 입력하면, 그 숫자의 제곱값을 리턴하면 된다.

그래서 처음에는 다음과 같이 코딩을 하였다.

1
2
3
4
repeat = int(input())
for i in range(0, repeat):
    num = int(input())
    print(num**2)
cs

하지만 이렇게 하면 맨 처음에 언급했듯이 계속 시간초과라는 문제에 직면하게 된다.

그래서 결국 인터넷을 계속 검색했고, 딱 필요한 내용을 잘 정리한 블로그를 찾았다.

https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io

 

여기에서 언급하듯이 "반복문으로 여러줄을 입력 받아야 할 때는 input()으로 입력 받는다면 시간초과가 발생"하는 경우가 생긴다.

때문에, 반복문으로 여러줄 입력받을 때는 sys.stdin.readline()를 사용하는 것이 바람직하다.

 

sys.stdin.readline()는 디폴트로 string형을 가진다. 또한, 한줄 단위로 입력받기 때문에 개행문자(\n)를 같이 입력 받는다.  따라서 다음과 같은 형태로 사용을 하면된다.

1
2
import sys
= int(sys.stdin.readline())
cs

 

**참고로 atom editor의 hydrogen plugin으로 프로그램을 실행하게 되면 계속 ValueError가 발생하게 된다. 

atom editor로 인해서 발생하는 에러

그런데 또 백준이나 repl.it, 혹은 command창으로 실행시키면 잘만 돌아간다. 

인터넷에서도 찾으면 spyder와 같이 되지 않는 경우도 있으니, 아마 시스템상으로 무언가가 있는 듯하다.

그러니 당황하지 말자!!


 

이렇게 해서 나온 제대로 된 답은 다음과 같다.

1
2
3
4
5
import sys
repeat = int(input())
for i in range(0, repeat):
    num = int(sys.stdin.readline())
    print(int(num)**2)
cs

 

 

+ Recent posts