지연 평가
면접 대비시간 제한1초메모리 제한1024 MB
1부터 1234567890123까지의 수가 담긴 배열에 덧셈, 곱셈, 앞쪽 원소 제거 명령을 수행하고 가장 작은 값을 출력합니다.
문제
지연이는 자신이 가진 배열 의 상태를 평가하려고 한다. 처음에 에는 부터 까지의 모든 정수가 개씩 들어 있다.
지연이를 도와 다음 명령을 수행하는 프로그램을 작성하시오.
0 x: 의 모든 원소에x를 더한다.x1 x: 의 모든 원소에x를 곱한다.x2 n: 에서 작은 원소부터 차례대로n개를 제거한다.n3: 에서 가장 작은 원소를 출력한다.
이 문제의 풀이를 작성하기 전에 아래 힌트를 참고할 수 있다.
입력
첫 줄에 명령의 개수 가 주어진다.
다음 줄부터 위에서 설명한 네 개의 명령 중 하나가 주어진다. x, n은 정수이다.
하나의 테스트케이스에서 2번 명령으로 들어오는 모든 n의 합은 이하이다.
하나의 테스트케이스에서 배열 에 들어 있는 어떤 수든지 그 절댓값이 언제나 이하가 되도록 하는 명령만이 주어진다.
마지막 명령은 항상 3이다.
출력
3번 명령이 들어올 때마다 그 시점에서 에서 가장 작은 값을 한 줄에 하나씩 출력한다.
힌트
Python 사용자라면, 간단한 테스트로 다음 두 프로그램을 로컬에서 돌려 보자.
a = [0] * (10 ** 15) # 10**15 byte is 1 Petabyte
print("calculating done!")
a = range(10 ** 15)
print("calculating done!")
두 번째 프로그램은 바로 끝나지만, 첫 번째 프로그램은 메모리 에러가 발생한다. range(10 ** 15) 구문은 0부터 까지의 모든 수를 즉시 생성하지 않기 때문이다. 대신 start, stop, step이라는 단 3개의 정수만을 내부에 저장하고, 0, 1, 2, 3, ... 순으로 필요할 때마다 수를 만들어 준다. 이처럼 결과가 필요할 때까지 표현식의 평가를 미루는 기법을 지연 평가(Lazy evaluation)라고 한다. 실제로 까지의 수가 모두 필요한 것이 아니라면, 예를 들어 100번째 소수를 발견했을 때 for문을 멈추고 그 값을 리턴하고 싶다면 지연 평가가 많은 도움이 된다. 이 문제도 부터 까지의 자연수를 하나씩 직접 생성하면 시간과 메모리를 엄청나게 잡아먹는다. 지연 평가를 사용해서 이 문제를 더 효율적으로 푸는 방법을 찾아보자.
range에 대한 자세한 내용은 Python 문서를 참고하자.