Stack은 입구가 하나밖에 없는 통으로 생각하고 문제를 풀면 편합니다. 나중에 들어간 것이 먼저 나오는 후입선출 형식이죠.
Stack의 문제 예시로는 브라우저 창을 열고 닫을 때 창들의 저장공간을 스택으로 비유합니다.
이동하는 순서와(actions), 현재창(start)을 인자로 받는 함수에서 로직으로는
뒤로가기 브라우저 배열(prev), 앞으로 가기 브라우저 배열(next), 현재 창 문자열(now), 3개의 값을 담을 결과 배열을 생성한다.
새로운 페이지를 접속할 경우, prev에 now값을 저장하고 now에 actions의 첫번째값을 저장한다. 그리고 next값을 비운다.(실제로 인터넷 브라우저에서 새창을 클릭하면 앞으로 갈 페이지는 없기 때문에 앞으로 가기 버튼은 활성화가 되지 않게 한다.)
뒤로가기 버튼일 경우, prev에 값이 있으면 now값을 next에 저장하고, prev값의 가장 뒤에 있는 값을 now 값에 저장한다.
앞으로가기를 누를경우, next에 값이 있으면 next배열의 가장 마지막 값을 now 에 할당하고 원래 now값은 prev에 저장한다.
Queue는 Stack과 달리 선입선출입니다. 요새 반올림 피자샵에서 작은 사건이 있었죠. 기존에 박나래님이 반올림의 모델이었는데 아이유님으로 바뀌고 피자박스에도 모델사진이 바뀌어 사람들이 많이 시켰습니다. 그런데 아직 박나래님 사진이 그려진 박스재고가 남아서 박나래님 박스가 다 빠져야 아이유님을 만날 수 있었다는..(선입선출ㅎㅎ)
Queue의 예시로는 프린터, 톨게이트 정도가 있습니다. 먼저 차가 들어오면 앞의 차가 나가기 전까지 뒤의 차들을 대기 해야하죠. 대기하는 시간을 버퍼라고 합니다.
프린터를 예시로 출력물을 다 출력하는데 걸리는 시간을 구하는 함수를 로직을 만들어보겠습니다. 해당 함수에서 받는 인자는 queue의 길이, 전체 queue에 들어갈 수 있는 용량, 출력물 배열 3개입니다.
출력물을 받을 때, 대기열에 있는 출력물과 새로 받을 출력물의 개수가 queue의 길이보다 작으면 받을 수 있습니다. 받을 수 있다면 대기열에 있는 출력물과 새로 받을 출력물의 양의 합이 최대 허용 용량 보다 작은지 확인합니다. 작다면 대기열에 출력물을 넣고, 출력물 배열에서 해당값을 빼줍니다.
대기열에 있는 출력물과 새로 받을 출력물의 양의 합이 최대 허용 용량 보다 크다면 기존에 버퍼에 있던 값을 빼주는데 1초가 지나간다고 계산하면 기존의 버퍼에 있던 값을 빼는데 1초를 소비합니다.
대기열에 있는 출력물과 새로 받을 출력물의 개수가 queue의 길이와 같아지면 새로 받을 수 없기 때문에 버퍼에 있는 값을 빼줍니다. 빼고난 후 대기열에 있는 출력물과 새로 받을 출력물의 양의 합이 최대 허용 용량 보다 작은지 다시 확인합니다. 이 과정을 원래 출력물이 다빠질때 까지 while문으로 반복을 해줍니다. 시간은 1초에 한 동작씩 동작하기 때문에 while문을 한번 돌 때마다 count++ 합니다.