본문 바로가기
Python/Baekjoon

[BOJ] 2022 SISS 1학기 스터디 - 2주차

by 단월໒꒱ 2022. 4. 9.

# 10828 : 스택 (Class 2 Silver 4)

[문제]

 

 

 

 

[코드 및 결과]

 

 

import sys

n = int(sys.stdin.readline())  #주어지는 명령의 수 입력 받기
stack = []  #스택 리스트 선언

for i in range(n):
    cmd = sys.stdin.readline().split()  #명령 입력 받기

    if cmd[0] == "push":  #push 명령
        stack.append(cmd[1])  #cmd 리스트 맨 뒤에 해당 정수 추가

    elif cmd[0] == "pop":  #pop 명령
        if len(stack) == 0:
            print(-1)
        else:
            print(stack.pop())  #stack 리스트 제일 마지막 원소 출력 후 제거

    elif cmd[0] == "size":  #size 명령
        print(len(stack))   #stack 리스트의 길이 출력

    elif cmd[0] == "empty":  #empty 명령
        if len(stack) == 0:
            print(1)
        else:
            print(0)

    elif cmd[0] == "top":  #top 명령
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[-1])  #stack 리스트 제일 마지막 원소 출력

 

 

 

 

 

 

[설명]

처음에 입력을 받을 때 input으로 하려다가 이전에 sys를 사용하면 시간이 단축할 수 있다는 말을 들었던 적이 있어서 sys를 이용해보았다.

 

input 대신에 sys 라이브러리를 넣고 sys.stdin.readline() 함수를 이용하여 값을 입력 받고 split() 함수를 이용하여 공백을 기준으로 입력받은 값을 나누어 cmd 리스트에 저장했다.

 cf) sys.stdin.readline()은 입력할 때 엔터가 줄 바꿈 기호로 입력되므로 rstrip() 함수를 써야한다.

       이 문제에서는 굳이 신경쓸 필요가 없기에 넣지 않았다.

 

push 명령은 정수를 스택에 넣으므로, append()로 리스트의 맨 끝에 해당 정수를 삽입해준다.

pop 명령은 정수를 스택의 맨 위에 있는 수를 빼고 출력하므로, pop()으로 인덱스를 지정하지 않고 해당 값을 출력한다.

size 명령은 스택에 들어있는 정수의 개수를 출력하므로, len을 이용하여 스택에 있는 원소의 개수를 출력해준다.

empty 명령은 스택이 비어있는지 확인하므로, len을 이용하여 리스트의 길이를 구해서 그 값이 0인지 확인해준다.

top 명령은 스택의 가장 위에 있는 정수를 출력하므로, 스택 맨 뒤에 있는 인덱스가 -1인 값을 출력한다.

 

 

 

#10845 : 큐 (Class 2 Silver 4)

[문제]

 

 

 

 

[코드 및 결과]

 

 

import sys

n = int(sys.stdin.readline())  #주어지는 명령의 수 입력 받기
queue = []  #큐 리스트 선언

for i in range(n):
    cmd = sys.stdin.readline().split()  #명령 입력 받기

    if cmd[0] == "push":  #push 명령
        queue.append(cmd[1])  #cmd 리스트 맨 뒤에 해당 정수 추가

    elif cmd[0] == "pop":  #pop 명령
        if len(queue) == 0:
            print(-1)
        else:
            print(queue.pop(0))  #cmd 리스트 맨 앞에 있는 원소 출력 후 제거

    elif cmd[0] == "size":  #size 명령
        print(len(queue))  #queue 리스트의 길이 출력

    elif cmd[0] == "empty":  #empty 명령
        if len(queue) == 0:
            print(1)
        else:
            print(0)

    elif cmd[0] == "front":  #front 명령
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[0])  #queue 리스트 맨 앞에 있는 원소 출력

    elif cmd[0] == "back":  #back 명령
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[-1])  #queue 리스트 맨 뒤에 있는 원소 출력

 

 

 

 

 

 

[설명]

앞서 풀었던 스택 문제와 매우 유사한 문제이다.

 

처음 정수와 명령어를 입력받는 것과 push, size, empty 명령에 대한 처리는 앞의 스택 문제와 동일한 코드라 생략한다.

 

pop 명령은 앞의 스택 문제와 달리 큐에서 가장 앞에 있는 정수를 빼고 출력하는 것이므로, pop으로 그 역할을 수행하되, 인덱스를 0으로 지정하여 맨 앞에 있는 수에 대해 해당 작업이 이루어지도록 해준다.

front 명령은 큐의 가장 앞에 있는 정수를 출력하므로, 큐 리스트에서 인덱스가 0인 부분에 저장되어 있는 값을 출력한다.

back 명령은 큐의 가장 뒤에 있는 정수를 출력하므로, 큐 리스트에서 인덱스가 -1인 부분에 저장되어 있는 값을 출력한다.

 

 

 

#10866 :  덱 (자유문제 Silver 4)

[문제]

 

 

 

 

[코드 및 결과]

 

 

import sys

n = int(sys.stdin.readline())  #주어지는 명령의 수 입력 받기
deque = []  #덱 리스트 선언

for i in range(n):
    cmd = sys.stdin.readline().split()  #명령 입력 받기

    if cmd[0] == "push_front":  #push_front 명령
        deque.insert(0, cmd[1])  #deque 리스트 맨 앞에 해당 정수 추가

    elif cmd[0] == "push_back":  #push_back 명령
        deque.append(cmd[1])  #deque 리스트 맨 뒤에 해당 정수 추가

    elif cmd[0] == "pop_front":  #pop_front 명령
        if len(deque) == 0:
            print(-1)
        else:
            print(deque.pop(0))  #deque 리스트 맨 앞의 원소 출력 후 제거

    elif cmd[0] == "pop_back":  #pop_back 명령
        if len(deque) == 0:
            print(-1)
        else:
            print(deque.pop())  #deque 리스트 맨 뒤의 원소 출력 후 제거

    elif cmd[0] == "size":  #size 명령
        print(len(deque))  #deque 리스트의 길이 출력

    elif cmd[0] == "empty":  #empty 명령
        if len(deque) == 0:
            print(1)
        else:
            print(0)

    elif cmd[0] == "front":  #front 명령
        if len(deque) == 0:
            print(-1)
        else:
            print(deque[0])  #deque 리스트의 맨 앞에 있는 원소 출력

    elif cmd[0] == "back":  #back 명령
        if len(deque) == 0:
            print(-1)
        else:
            print(deque[-1])  #deque 리스트의 맨 뒤에 있는 원소 출력

 

 

 

 

 

 

[설명]

위의 두 문제와 틀은 거의 비슷하지만 몇가지 명령이 추가된 문제이다.

 

push_front, push_back, pop_front, pop_back 명령이 구분되어 있으므로 위에서 push, pop 명령을 처리했을 때와 달리 해당 명령이 리스트의 첫 원소에 적용되는지, 마지막 원소에 적용되는지 구분을 할 필요가 있었다.

 

push_front 명령은 정수를 덱의 앞에 넣으므로, insert(0, cmd[1])로 리스트의 인덱스가 0인 위치에 해당 정수를 삽입해준다.

push_back 명령은 정수를 덱의 뒤에 넣으므로, append(cmd[1])로 리스트의 맨 끝에 해당 정수를 삽입해준다.

pop_front 명령은 덱의 맨 앞에 있는 수를 빼고 출력하므로, pop(0)으로 인덱스를 지정한 뒤 해당 값을 출력한다.

pop_back 명령은 덱의 맨 뒤에 있는 수를 빼고 출력하므로, pop()으로 인덱스를 지정하지 않고 해당 값을 출력한다.

 

이 외의 나머지 명령은 리스트 이름만 바꾸었을 뿐 앞의 문제에서 짠 코드와 동일하다.

 

 

 

 

'Python > Baekjoon' 카테고리의 다른 글

[BOJ] 2022 SISS 1학기 스터디 - 3주차  (0) 2022.05.04
[BOJ] Bronze Ⅴ, IV - Day 13  (0) 2022.01.09
[BOJ] Bronze Ⅴ- Day 12  (0) 2022.01.08
[BOJ] Bronze Ⅴ- Day 11  (0) 2022.01.08
[BOJ] Bronze Ⅴ- Day 10  (0) 2022.01.05

댓글