Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[코딩테스트] - 큐 문제풀이 본문

프로그래밍

[코딩테스트] - 큐 문제풀이

yesungcho 2024. 3. 1. 13:14

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

 

18258번: 큐 2

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

www.acmicpc.net

 

import sys
N = int(sys.stdin.readline())
from collections import deque

queue = deque([])

for _ in range(N) :
    command = sys.stdin.readline().split()

    if command[0] == 'push' :
        queue.append(command[1])

    elif command[0] == 'pop':
        if queue : 
            print(queue.popleft())
        else :
            print(-1)

    elif command[0] == 'size' :
        print(len(queue))

    elif command[0] == 'empty' :
        if queue :
            print(0)
        else :
            print(1)

    elif command[0] == 'front' :
        if queue: 
            print(queue[0])
        else :
            print(-1)

    elif command[0] == 'back' :
        if queue :
            print(queue[-1])
        else :
            print(-1)

 

 

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

 

2346번: 풍선 터뜨리기

1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선

www.acmicpc.net

'''
import sys
N = int(sys.stdin.readline())
num_written = [int(x) for x in sys.stdin.readline().split()]

num_set = list(enumerate(num_written))

idx = 0
for _ in range(N) :
    curr = num_set[idx]
    pre_idx = idx
    print(curr[0]+1, end=' ')
    del num_set[idx]
    idx = idx+curr[1]
    if idx >= len(num_set) :
        idx = idx-len(num_set)-1
    elif idx < 0 :
        idx = idx+len(num_set)
    if pre_idx < idx :
        idx = idx-1
'''
### 위와 같이 그때 그때 주어진 테스트케이스에 맞게 짜려고 해도 안되는 경우 존재

### 어떻게 deque로 문제를 풀어내는지 살펴보자, 정확히는 deque의 rotate 기능을 알자
import sys
from collections import deque

N = int(sys.stdin.readline())
num_written = [int(x) for x in sys.stdin.readline().split()]

num_set = list(enumerate(num_written))
num_set = deque(num_set)

for _ in range(N) :
    curr = num_set.popleft()
    print(curr[0]+1,end=' ')

    #### 음수 방향이냐 양수 방향이냐에 따라, -1을 해줘야하는 거 주의하자
    #### 또한 rotate(N) 이 수가 오른쪽으로 돌기 위해서는 음수, 왼쪽으로 돌기 위해서는 양수여야 함을 기억

    ### ex)
    ### num_list = deque([1,2,3,4,5])
    ### num_list.rotate(1) # deque([5,1,2,3,4]) # 우리 기준 시계 반대 방향
    ### num_list.rotate(-1) # deque([2,3,4,5,1]) # 우리 기준 시계 방향
    if curr[1] > 0 :
        num_set.rotate(-(curr[1]-1))
    else :
        num_set.rotate(-curr[1])