본문 바로가기
백준/자료구조

[백준] #18258 큐 2 (python)

by 똥먹는낙타 2022. 2. 4.
728x90
반응형

18258번: 큐 2 (acmicpc.net)

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

큐 하니까.. 한큐 교수님 생각나네 ^-^.. 교수님 ~ 잘 지내시나요? 저한테 비내려주시고..

제가 빗소리 asmr 좋아하는건 또 어찌 아시고.. 

그래도 서운하네요.. 나름 코드 열심히 외워가서 빈칸 채웠었는데 말이죠..

 

문제

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

 

 예제 입력1

15
push 1
push 2
front
back
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
front

 

예제 출력1

1
2
2
0
1
2
-1
0
1
-1
0
3

 


# Code

import sys

n = int(sys.stdin.readline()) #input으로 하면 시간초과

queue = []
count = 0

for _ in range(n):
    s = sys.stdin.readline().split() 
    if s[0] == 'push':
        queue.append(int(s[1]))
    elif s[0] == 'pop':
        if len(queue)>count: 
            print(queue[count])
            count=count+1
        else: print(-1)
    elif s[0] == 'size':
        print(len(queue)-count)
    elif s[0] == 'empty':
        if len(queue)==count:
            print(1)
            count = 0
            queue = []
        else: print(0)
    elif s[0] == 'front':
        if len(queue)>count: print(queue[count])
        else: print(-1)
    elif s[0] == 'back':
        if len(queue)>count: print(queue[-1])
        else: print(-1)

 

# Solution

우선.. 아니 도대체 얘는 맨 앞에껄 pop하려면 어떻게 해야 하나 아주 지렐발광을 했는데 ^^

결국 실패해서 구글링을 해봤다.

근데 방법이 대충 deque 쓰는거랑 그냥 pop 한다고 생각하지 말고 index를 계속 카운트해서 index 앞에 있는 것들은 pop 해서 없는 거라고 대충 가정하고 뒤에 있는 것들을 출력하는 방법 이렇게 있는 것 같았다.

deque 쓰는건 뭔가.. 안땡겨!!! 그래서 그건 나중에 알아보도록 하고 ~ ^^

pop을 안하고 그냥 인덱스 계속 넘기는 그런 생각은 또 어케하는거야 부럽따. 하여튼 이 힌트를 보고 다시 풀어봤다.

 

이렇게 하려니까 뭔가.. 되게 헷갈려서 여러 번 고치긴 했다.

count 가 index이고, pop 명령어가 올 때 마다 해당 count의 값을 출력해주고 count++ 해준다.

그러면 이미 출력한 놈은 이제 없는 셈 치고, 그 다음 pop 명령어가 올 땐 그 증가된 count가 가리키는 값이 나오겠죵?

이렇게 하면 size 부분에서 queue의 총 길이 - count 를 해줘야하고, empty 부분에서도 queue의 총 길이와 count가 같은지를 확인해서 출력해줘야 한다.  

처음엔 그냥 count 계속 증가하는 식으로 했는데, 구글링 하다가 다른 블로그에서 empty 부분에 저런 식으로 count와 queue를 초기화해주는 것을 보고 헉!! 좋다!! 싶어서 바로 나도 추가했다.. ㅎㅎ... 계속 늘어나는 것보다 저렇게 중간에

초기화 해주면 확실히 메모리도 덜 쓰고 훨씬 좋을 것 같다. 나는 왜 이런 생각을 몬하지.. 

 

피곤하다. deque는 이따 다시 찾아봐야지.

728x90
반응형

'백준 > 자료구조' 카테고리의 다른 글

[백준] #10866 덱 (python)  (2) 2022.02.05
[백준] #2164 카드 2 (python)  (2) 2022.02.05
[백준] #9012 괄호 (python)  (0) 2022.02.04
[백준] #10828 스택 (python)  (0) 2022.02.02
[백준] #1158 요세푸스 문제 (python)  (2) 2022.02.02

댓글