[알고리즘] 백준 10845 (파이썬 풀이)

    728x90

    https://www.acmicpc.net/problem/10845

     

    10845번: 큐

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

    www.acmicpc.net

    문제

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

    명령은 총 여섯 가지이다.

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

    입력

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

    출력

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

     

    해결코드

    import sys
    
    n = int(sys.stdin.readline())
    li = []
    for i in range(n):
        m = sys.stdin.readline().split()
        if(m[0]=='push'):
            li.append(m[1])
        elif(m[0]=='pop'):
            if(len(li)==0):
                print(-1)
            else:
                print(li.pop(0))
        elif(m[0]=='size'):
            print(len(li))
        elif(m[0]=='empty'):
            if(len(li)==0):
                print(1)
            else:
                print(0)
        elif(m[0]=='front'):
            if(len(li)==0):
                print(-1)
            else:
                print(li[0])
        elif(m[0]=='back'):
            if(len(li)==0):
                print(-1)
            else:
                print(li[-1])

    문제풀이

    일단 이 문제는 이전에 풀어봤던 스택 문제에서 조금만 수정하면 되면 쉽게 해결된다.

    스택과 큐의 차이점은 무엇일까?

    스택은 말그대로 계속해서 값이 쌓이는 것이다. 계속 쌓이면 값이 빠질때도 맨 마지막에 들어온 값부터

    빠지게 된다는 말이다.

    반면에 큐는 앞과 뒤가 모두 뚫려있다. 이말은 선입선출이 가능하다는 말이다.

    앞과 뒤가 뚫려있으므로 스택처럼 쌓이지 않고 먼저 들어온건 먼저 나갈 수 있다.

    이것을 이용해 문제를 풀면 된다.

    sys라이브러리의 readline()을 이용하여 입력시간을 줄여주고

    n을 입력받는다. 또 li라는 큐를 하나 생성해준다.

    n개의 케이스를 받아야 하므로 for문을 돌려준다.

    for문 안에서 'push 1'과 같은 띄어쓰기를 포함한 값들을 받아야 하므로

    split을 이용해 m에 값을 넣어준다.

    나머지는 스택과 똑같고 'pop'일때 스택은 제일 최근 값을 빼지만

    큐일때는 li.pop(0)을 하여 큐의 첫번째 값을 빼준다.

    나머지는 조건에 맞추어 식을 작성하면 해결된다.

    728x90

    댓글