https://www.acmicpc.net/problem/17298
17298번: 오큰수
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
www.acmicpc.net
- 자료구조, 스택
import sys
input = sys.stdin.readline
n = int(input())
data = list(map(int, input().split()))
result = []
for i in range(n): # 9548
lstack, rstack = [], []
for j in range(i+1, n): #548
if data[i] < data[j]:
lstack.append(data[j])
elif data[i] > data[j]:
rstack.append(data[i])
if len(lstack) != 0:
result.append(lstack[0])
if len(rstack) != 0:
if max(rstack) == max(data):
result.append(-1)
result.append(-1)
print(result)
- 정답은 야매로 했지만, 시간초과로 실패 함.
n = int(input())
arr = list(map(int, input().split()))
stack = [] # 스택 초기화
NGE = [-1] * n
for i in range(n):
x = arr[i]
if len(stack) == 0 or stack[-1][0] >= x:
stack.append((x, i)) # (수, 인덱스) 형태로 삽입
else:
while len(stack) > 0: # 역방향으로 하나씩 추출
previous, index = stack.pop()
if previous >= x: # 크기나 같은 이전 원소를 만났다면 다시 삽입
stack.append((previous, index))
break
else:
NGE[index] = x # 오큰수 기록
stack.append((x, i)) # (수, 인덱스) 형태로 삽입
for x in NGE:
print(x, end =' ')
- 이 문제는 다시 풀어봐야할듯
n = 11
data = [3,2,1,10,9,5,4,8,15,11,13]
LB = [-1] * n
stack = []
for i in range(n):
x = data[i]
if len(stack)==0 or stack[-1][0] >= x: # 최상단 원소가 새로운 값보다 같거나 클 때 스택 삽입
stack.append((x,i))
else:
while len(stack) > 0:
value, idx = stack.pop()
if value >= x:
stack.append((value, idx))
break
else:
LB[idx] = x
stack.append((x, i))
for i in LB:
print(i, end=' ')
- for i in LB:
print(i, end=' ')- " print(i, end=' ')"를 통해 한줄에 한번에 출력
- 스택으로 문제를 접근함.
- "data = [3,2,1,10,9,5,4,8,15,11,13]" 아래 값이 입력으로 들어 왔다고 가정했을 때 새로운 큰 수가 나오기 전까지는 전부다 "stack"에 어팬드 해줌, 이후 큰 수를 만났을 때 추가되었던 스택 을 뒤에서 부터 하나씩 꺼내며 확인을 함
- "value, idx = stack.pop()" 확인을 시작하는데
- 현재 꺼낸 값이 최상단으로 들어온 "x" 보다 크다면 다시 꺼낸 값을 그대로 돌려놓고 반복문 종료
- if value >= x: stack.append((value, idx))
break
- if value >= x: stack.append((value, idx))
- 그렇지 않으면 다시 오큰수로 최상단 값을 기존 추가하였던 스택의 개별 인덱스로 저장함 LB[idx] = x
- 현재 꺼낸 값이 최상단으로 들어온 "x" 보다 크다면 다시 꺼낸 값을 그대로 돌려놓고 반복문 종료
- 이후 새로 들어온 x 값을 스택에 새로 추가함
- "value, idx = stack.pop()" 확인을 시작하는데
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
- 자료구조, 덱
# import sys
# input = sys.stdin.readline
from collections import deque
n, m = map(int, input().split()) # 원소 개수, 뽑아내는 횟수
data = list(map(int, input().split())) # 뽑아낼 원소 목록
d = deque([i for i in range(1, n+1)]) #덱
cnt = 0
for i in data:
index = d.index(i)
if index <= len(d) // 2:
for i in range(index):
d.rotate(-1)
cnt +=1
else:
for i in range(len(d) - index):
d.rotate(1)
cnt +=1
d.popleft()
print(cnt)
- 문제의 핵심은 입력 받는 값 ex) 2, 9, 5 등 값들이 n까지의 원소들중 중간 앞에 위치하면 왼쪽 회전, 중간 뒤에 위치하면 우측 회전이다.
- 원소 개수 "n"까지 데크를 만들어 둠. 이후 각각의 개별 데이터들"i"을 입력으로 받아옴
- 현재 개별 데이터들이 생성해둔 데크 안에 어디에 위치하는지 알기 위해 인덱스로 위치를 개별 매칭함 "index = d.index(i)"
- 앞서 1번에서 말한 것 처럼 중간 앞에 위치하면 "if index <= len(d)//2:"
- 현재 "index" 값만큼 좌측회전 "d.rotate(-1)" 후 카운트
- 위와 같이 만약 왼쪽에 위치한다면 "if index > len(d)//2" or "else"
- 현재 전체 데크의 길이 "lend(d) - index" 에서 인덱스를 뺀 횟수만큼 우측회전 " d.rotate(1) "
- 끝으로 회전이 끝난 뒤 각 개별데이터들은 리스트 맨앞에 위치하므로 뽑기"d.popleft()"
https://www.acmicpc.net/problem/11866
11866번: 요세푸스 문제 0
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)
www.acmicpc.net
- 자료구조, 덱
from collections import deque
# n, m = 7,3
n, m = map(int, input().split())
d = deque([i for i in range(1, n+1)])
result = []
while len(d) > 0:
d.rotate(-(m-1))
result.append(d[0])
d.popleft()
temp = str(result)[1:-1]
print(f"<{temp}>")
- 처음부터 좌측[0]을 기준으로 입력 받은 k-2 씩 좌측으로 회전해주면 끝인문제
'CoTe > fastcampus' 카테고리의 다른 글
05. 기본 탐색 알고리즘 - 기초 문제풀이 - 탐색 (0) | 2024.03.15 |
---|---|
6. 기본 자료구조 - 핵심 유형 문제 풀이-3 - 덱 (0) | 2024.03.10 |
04. 기본 자료구조 - 핵심 유형 문제 풀이-1 - 스택 (0) | 2024.03.06 |
03 고급 자료구조 - 핵심 유형 문제풀이 -해시문제 (0) | 2024.03.06 |
02. 기본 자료구조 - 핵심 유형 문제풀이 - 스택, 큐 (0) | 2024.03.03 |