- 1. 가장 큰 수(스택)
- m 개의 숫자를 제거해서 얻을 수 있는 가장 최대 값
# ch5. 1. 가장 큰 수(스택)
#n = 84836543798739827589237689348957893758937689437896743489673489673986
#d = 30
n=5276823
d=3
stack = []
num = list(map(int, str(n)))
for x in num:
while stack and d>0 and stack[-1]< x:
stack.pop()
d = d - 1
stack.append(x)
# 다 삭제되지 않은 경우 만들어진 숫자에서 제거해주기
if d!=0:
stack = stack[:-d]
print(stack)
- 2. 쇠막대기 - 복습
# ch5 - 2. 쇠막대기
str = '(((()(()()))(())()))(()())'
stack = []
res = 0
for i in range(len(str)):
if str[i] == '(':
stack.append(str[i])
else:
stack.pop()
if str[i-1] == '(':
res = res + len(stack)
else:
res = res + 1
print(res)
- 3. 후위표기식 만들기
# ch5 - 3. 후위표기식 만들기
n = '3+5*2/(7-2)'
stack = []
res = ''
for x in n:
if x.isdigit():
res = res + x
else:
if x == '(':
stack.append(x)
elif x == '*' or x == '/':
while stack and (stack[-1] == '*' or stack[-1] == '/'):
res = res + stack.pop()
stack.append(x)
elif x == '+' or x == '-':
while stack and (stack[-1] != '('):
res = res + stack.pop()
stack.append(x)
elif x == ')':
while stack and (stack[-1] != '('):
res = res + stack.pop()
stack.pop()
while stack:
res = res+stack.pop()
print(res)
- 4. 후위식 연산
# ch5 - 4. 후위식 연산
from curses.ascii import isdigit
n = '58+65*+32+-73*-5-323*++53+2+52*-+3+'
stack = []
for x in n:
if x.isdigit():
stack.append(int(x))
else:
if x=='+' or x=='-':
op1 = stack.pop()
op2 = stack.pop()
res = 0
if x=='+':
res = op1+op2
else:
res = int(abs(op1-op2))
stack.append(res)
elif x=='*' or x=='/':
op1 = stack.pop()
op2 = stack.pop()
if x=='*':
res = op1*op2
elif x=='/' and op1>op2:
res = op1//op2
else:
res = op2//op1
stack.append(res)
print(stack.pop())
- 5. 공주 구하기
- 1번부터 돌아가면서 K번째 사람 제거하기
# ch5 - 5. 공주 구하기
from collections import deque
n, k = 700, 9
arr = list(range(1,n+1))
q = deque(arr)
while q:
# k번 만큼 idx 이동하면서 값을 빼면서 idx를 찾기전 까지 바로 값을 뒤에 붙여준다.
for _ in range(k-1):
current=q.popleft()
q.append(current)
q.popleft() # k 번째 값 삭제
# 길이가 1이 되면 마지막 원소를 출력해주고 종료한다.
if len(q)==1:
print(q[0])
q.popleft()
- 6. 응급실
- 우선순위 별로 치료할 때, M번째 환자의 진료 순서를 구하기
# ch5 - 6. 응급실
from collections import deque
n, m = 5, 2
risk = [60,50,70,80,90]
q = []
cnt = 0
# 우선순위 큐 생성 - index, value
for pos, val in enumerate(risk):
q.append((pos, val))
q = deque(q)
while True:
# 큐에서 pop
current = q.popleft()
# 제일 앞의 값보다 더 큰 수가 있으면 뒤로 보낸다
if any(current[1]<x[1] for x in q):
q.append(current)
# 제일 앞의 값이 가장 큰 경우
# 진료 횟수 cnt 증가
else:
cnt = cnt + 1
# 찾는 환자일 경우에 break
if current[0] == m:
print(cnt)
break
- 7. 교육과정 설계
- 사전 필수 과목을 이수하지 않으면 NO 출력
- 필수 과목을 모두 이수하지 않으면 NO
# ch5 - 7. 교육과정 설계
str = 'CBA'
n = 3
list = ['CBDAGE','FGCDAB','CTSBDEA']
stackList = []
resList = []
for i in range(len(str)):
stackList.append(str[-i-1])
#print(str[-i-1])
for x in list:
preIdx = 0
res = 'YES'
stack = stackList.copy()
while stack:
search = stack.pop()
flag = x.find(search) # 없으면 -1
if flag != -1: # 있는 경우
idx = x.index(search)
if preIdx > idx:
res = 'NO'
break
else:
preIdx = idx
else:
res = 'NO'
break
resList.append(res)
print(resList)
- 8. 단어 찾기
- 1개를 제외한 모든 값들이 2번
# ch5 - 8. 단어 찾기
n = 5
listA = ('big','good','sky','blue','mouse')
listB = ('sky','good','mouse','big')
dict = {}
for x in range(len(listA)):
dict[listA[x]] = 1
for x in range(len(listB)):
del(dict[listB[x]])
for key, val in dict.items():
# print(key, val)
print(key)
- 9. Anagram(아나그램)
- 순서는 다르지만, 알파벳 개수가 같은 경우 찾기
# ch5 - 9. Anagram(아나그램)
from collections import defaultdict
# ch1 = 'AbaAeCe'
# ch2 = 'baeeACA'
ch1 = 'aacccc'
ch2 = 'ccccaa'
dict1 = defaultdict(int)
dict2 = defaultdict(int)
res = 'YES'
for x in range(len(ch1)):
dict1[x] = dict1.get(ch1[x],0)+1
dict2[x] = dict2.get(ch2[x],0)+1
#dict1[ch1[x]] = dict1[ch1[x]] + 1
#dict2[ch2[x]] = dict2[ch2[x]]+ 1
for key, value in dict1.items():
if dict2[key]!=value:
res = 'NO'
break
print(res)
- 10. 최소 힙 - 복습
# ch5 - 10. 최소 힙
# 최소힙 : 완전이진트리, 부모가 자식보다 작다.
import heapq as hq
n = [5, 3, 6, 0, 0, 2, 4, 0, -1]
stack = []
minVal = float('inf')
for x in n:
if x==-1:
break
if x==0:
if len(stack)==0:
print(-1)
else:
print(hq.heappop(stack))
else:
hq.heappush(stack, x)
- 11. 최대 힙 - 복습
import heapq as hq
n = [5,3,6,0,5,0,2,4,0,-1]
stack = []
for x in n:
if x==-1:
break
if x==0:
if len(stack) ==0:
print('-1')
else:
print(-hq.heappop(stack))
else:
hq.heappush(stack, -x)
'코딩테스트 > 인프런' 카테고리의 다른 글
[Python] 6장 백트래킹&상태트리&DFS 내용 정리 (0) | 2022.08.03 |
---|---|
[Python] 4장 이분탐색(결정 알고리즘)&그리디 내용 정리 (0) | 2022.08.02 |
[Python] 3장 string&탐색&시뮬레이션 내용 정리 (0) | 2022.08.02 |
[codility] Lesson 2. Arrays - CyclicRotation (0) | 2022.08.01 |
[codility] Lesson 1. Iterations - BinaryGap (0) | 2022.08.01 |