두 배로 늘어나는 배열
정수를 담는 늘어나는 배열을 직접 만든다.
배열은 원소의 수(크기)와, 메모리를 빌려 둔 칸의 수(용량)를 따로 가진다.
처음에는 크기가 0, 용량이 1이다.
명령은 네 가지다.
- push x: 크기가 용량과 같으면 먼저 용량을 2배로 늘린 다음(늘리기 1번), 맨 뒤에 x를 넣는다.
- pop: 비어 있으면 empty를 출력한다.
아니면 맨 뒤의 값을 빼서 출력하고, 그 뒤 용량이 2 이상이고 크기×4가 용량 이하이면 용량을 반으로 줄인다(줄이기 1번).
- get i: 0부터 센 i번째 값을 출력한다.
i가 크기 이상이면 out of range를 출력한다.
- info: 크기와 용량을 빈칸 하나로 띄워 출력한다.
첫 줄에 명령 수 q, 다음 q줄에 명령이 하나씩 주어진다.
명령마다 위의 출력을 한 줄씩 하고, 마지막 줄에 "grow 늘린횟수 shrink 줄인횟수"를 출력하라.
info가 출력하는 용량은 언제나 위 규칙으로 정해지는 값이다.
C는 realloc으로 빌린 블록의 크기를 바꾸고, C++는 용량을 변수로 직접 세면서 std::vector의 reserve로 그만큼 미리 빌려 보자.
- 입력
- 1 ≤ q ≤ 100,000, -1,000,000,000 ≤ x ≤ 1,000,000,000, 0 ≤ i ≤ 100,000(정수)
- 출력
- push가 아닌 명령마다 한 줄, 마지막 줄에 "grow G shrink S"
9 push 4 push 8 push 15 info get 2 pop pop info get 1
3 4 15 15 8 1 2 out of range grow 2 shrink 1