https://www.acmicpc.net/problem/10866
<문제 해설>
앞뒤로 값을 수정할수 있 자료구조인 dqueue를 만들면 된다. 이때 앞에값 제거하거나 추가하면 시간이 많이 걸리니 index를 활용해 값을 제거or추가 하지 않고 공간을 이동해서 값을 제거하는 효과를 만들겠다. front로 dequeue의 가장앞이 어딘지 알려주고 end으로 가장 뒤가 어딘지 알려주겠다. 값을 넣으면 front자리에 값이 들어가고 front가 감소한거나 end자리에 값이 들어가고 back이 증가한다. pop을 할땐 반대로 front가 증가하거나 end이 감소해서 값은 지우지 않았지만 나중에 출력할때 값을 읽지 않게되어 값을 삭제한것과 같은 효과를 만들겠다. size와 empty는 front와 end의 차를 계산해서 계산하면된다.
<예시>
입력 : 10 push_back 1 push_front 2 front back size empty pop_front pop_back pop_front empty
출력값 : 2 1 2 0 2 1 -1 1
<코드>
import sys
N = int(sys.stdin.readline())
queue =[0]*20002
front = 10001
end = 10002
for i in range(N):
command = sys.stdin.readline().split()
if command[0] == 'push_back':
queue[end]= int(command[1])
end +=1
elif command[0] == 'push_front':
queue[front]= int(command[1])
front -=1
elif command[0] == 'pop_front':
if end-front-1 == 0:
print(-1)
else:
front +=1
print(queue[front])
elif command[0] == 'pop_back':
if end-front-1 == 0:
print(-1)
else:
end -=1
print(queue[end])
elif command[0] == 'size':
print(end-front-1)
elif command[0] == 'empty':
if end-front-1 == 0:
print(1)
else:
print(0)
elif command[0] == 'front':
if end-front-1 == 0:
print(-1)
else:
print(queue[front+1])
elif command[0] == 'back':
if end-front-1 == 0:
print(-1)
else:
print(queue[end-1])
<코드 설명>
import sys //sys라이브러리 불러오기
N = int(sys.stdin.readline()) //N값 받아오기
queue =[0]*20002 //queue가 만들어질 배열을 미리 만든다
front = 10001 //실행회수가 10000번이라 앞뒤로 10000번씩 들어갈수도 있으니 앞뒤로 10000개의 배열이 남는 중앙이 시 작점이다
end = 10002 //위와 동일
for i in range(N): //N만큼 반복
command = sys.stdin.readline().split() //command 받아오기 push일경우 빈같을 기준으로 나눠 받아오기
if command[0] == 'push_back': //뒤에 값을 넣으라면
queue[end]= int(command[1]) //뒷 인덱스에 값을 넣고
end +=1 //뒷인덱스 증가
elif command[0] == 'push_front': //앞에 값을 넣으라고하면
queue[front]= int(command[1]) //앞인덱스에 값 넣고
front -=1 //앞 인덱스 감소
elif command[0] == 'pop_front': //앞인덱스 pop하라 하면
if end-front-1 == 0: //큐가 비었는지 확인하고
print(-1) //비었으면 -1
else: //안비었으면
front +=1 //앞인덱스 증가하고
print(queue[front]) //앞인덱스 자리에 있는 값 출력
elif command[0] == 'pop_back': //뒷 인덱스 pop하라고 하면
if end-front-1 == 0: //위와 같음
print(-1)
else:
end -=1 //뒷인덱스 감소하고
print(queue[end]) //인덱스 자리의 값 출
elif command[0] == 'size': //큐 크기를 측정하라하면
print(end-front-1) //end와 front의 차이 계산 빈 상태일때 front와 end가 기본적으로 1차이 남으로 -1해준다
elif command[0] == 'empty': //비었는지 확인하라고 하면
if end-front-1 == 0: //위와 같음
print(1) //비었다면 1
else:
print(0) //안비었다면 0
elif command[0] == 'front': //앞에있는값 출력
if end-front-1 == 0: //비었는지 확인
print(-1)
else:
print(queue[front+1]) //안비었으면 front의 뒷값 출력 이때는 삭제하지 않고 출력만 하기때문
elif command[0] == 'back': //뒤에있는 값 출력
if end-front-1 == 0:
print(-1)
else:
print(queue[end-1]) //end의 앞값 출력
'Coding Test > Python' 카테고리의 다른 글
[Python/백준] 11650 좌표 정렬하기 (0) | 2023.01.12 |
---|---|
[Python/백준] 1181 단어 정렬 (0) | 2023.01.12 |
[Python/백준] 1978 소수 찾기 (1) | 2023.01.12 |
[Python/백준] 10845 큐 (0) | 2023.01.12 |
[Python/백준] 10828 스택 (0) | 2023.01.11 |
Coding, Software, Computer Science 내가 공부한 것들 잘 이해했는지, 설명할 수 있는지 적는 공간