🟢 푼 문제
🟡 접근 방법을 알았지만 못 푼 문제
🔴 접근 방법도 모르고 못 푼 문제
TypeError: unhashable type: 'list'
에러가 발생했다.def solution(seat):
d = {}
for x, y in seat:
d[(x, y)] = d.get((x, y), 0) + 1
return len([k for k, v in d.items()])
# 배열로 stack을 구현해 사용하자
def solution(s):
d = {')':'(', '}':'{', ']':'['}
stack = []
for x in s:
# 여는 괄호이면 stack에 집어넣자
if x in ['(', '{', '[']:
stack.append(x)
# 닫는 괄호이면 stack의 가장 위 원소와 비교하자
else:
# stack이 비어있으면 짝이 맞지 않는 것이므로 false
if len(stack) == 0:
return False
# stack의 가장 나중에 들어간 여는 괄호와 짝이 맞으면 pop
if d[x] == stack[-1]:
stack.pop()
# 여는 괄호과 짝이 맞지 않으면 false
else:
return False
# 모든 괄호를 검사했는데 stack에 남아있는 원소가 있으면 false
if len(stack) != 0:
return False
return True
import itertools
def solution(n):
answer = 0
arr = [True] * (n + 1)
# 0과 1은 소수가 아니다
arr[0], arr[1] = False, False
for i in range(2, int(n ** (1/2)) + 1):
j = 2
while i * j <= n:
arr[i * j] = False
j += 1
nums = [i for i in range(n) if arr[i] == True]
candidates = list(itertools.combinations(nums, 3))
for x in candidates:
if sum(x) == n:
answer += 1
return answer
def solution(v):
x = {}
y = {}
for i, j in v:
x[i] = x.get(i, 0) + 1
y[j] = y.get(j, 0) + 1
a = [k for k, v in x.items() if v == 1][0]
b = [k for k, v in y.items() if v == 1][0]
return [a, b]
def solution(max_weight, specs, names):
specs = {i:int(j) for i, j in specs}
weight_sum = 0
answer = 1
for n in names:
weight_sum += specs[n]
if weight_sum > max_weight:
answer += 1
weight_sum = specs[n]
return answer
def solution(d, budget):
d.sort()
answer = 0
for x in d:
if budget >= x:
budget -= x
answer += 1
else:
break
return answer
def solution(s):
stack = []
for x in s:
# 여는 괄호이면 stack에 집어넣자
if x == '(':
stack.append(x)
# 닫는 괄호이면
else:
# stack이 비어있으면 짝이 맞지 않는 것이므로 false
if len(stack) == 0:
return False
# stack의 가장 나중에 들어간 여는 괄호와 짝이 맞으면 pop
if stack[-1] == '(':
stack.pop()
# 여는 괄호과 짝이 맞지 않으면 false
else:
return False
# 모든 괄호를 검사했는데 stack에 남아있는 원소가 있으면 false
if len(stack) != 0:
return False
return True
import re
def solution(skill, skill_trees):
answer = 0
for x in skill_trees:
# 선행 스킬 순서에 상관 없는 스킬들은 제거하고 시작하자
x = re.sub('[^' + skill + ']', '', x)
if x == skill[:len(x)]:
answer += 1
return answer
push
: stack1에 원소를 push한다.pop
: stack1에 들어있는 원소를 차례대로 stack2에 옮겨 담는다. stack1에 가장 먼저 들어갔던 원소가 stack2의 가장 위에 놓이게 된다. 이 때 stack2에서 pop하면 FIFO가 구현된다. 그 후에는 stack2의 원소들을 다시 차례대로 stack1에 옮겨 담는다. class MyStack(object):
def __init__(self):
self.lst = list()
def push(self, x):
self.lst.append(x)
def pop(self):
return self.lst.pop()
def size(self):
return len(self.lst)
class MyQueue(object):
def __init__(self, max_size):
self.stack1 = MyStack()
self.stack2 = MyStack()
self.max_size = max_size
def qsize(self):
return self.stack1.size()
def push(self, item):
# 큐가 꽉 찬 경우 False 리턴
if self.stack1.size() == self.max_size:
return False
else:
self.stack1.push(item)
return True
def pop(self):
# 큐에 원소가 없다면 에러 발생
try:
if self.stack1.size() == 0:
raise emptyException
# stack1의 원소를 모두 stack2에 옮겨 담자
# stack2에는 나중에 stack1에 들어간 원소가 가장 바닥에(처음 들어간 원소는 가장 위에) 있게 된다
while self.stack1.size() > 0:
self.stack2.push(self.stack1.pop())
item = self.stack2.pop()
# 다시 stack1에 옮겨 담아 순서를 유지하자
while self.stack2.size() > 0:
self.stack1.push(self.stack2.pop())
return item
except emptyException:
return False
class emptyException(Exception):
pass
n, max_size = map(int, input().strip().split(' '))
q = MyQueue(max_size)
for i in range(n):
order = input()
if order == 'POP':
print(q.pop())
elif order == 'SIZE':
print(q.qsize())
else:
order, x = order.strip().split(" ")
print(q.push(int(x)))
import heapq
def solution(scoville, K):
heapq.heapify(scoville)
answer = 0
while True:
min1 = heapq.heappop(scoville)
if min1 >= K:
break
elif len(scoville) > 0:
min2 = heapq.heappop(scoville)
new_scoville = min1 + (min2 * 2)
answer += 1
heapq.heappush(scoville, new_scoville)
elif len(scoville) == 0:
answer = -1
break
return answer
import heapq
def solution(n, works):
# 최대 힙을 구현해야 한다
# works = [4, 3, 3]인 경우 원소의 부호를 바꾸면 최소 힙에 [-4, -3, -3]으로 들어간다
works = [-w for w in works]
heapq.heapify(works)
while n > 0:
if -works[0] <= 0:
break
max_work = -(heapq.heappop(works))
heapq.heappush(works, -(max_work - 1))
n -= 1
return sum([w ** 2 for w in works])
def solution(s):
stack = []
for x in s:
# 스택이 비어있으면 x를 집어넣자
if len(stack) == 0:
stack.append(x)
# 비어있지 않으면
else:
# 스택에 마지막에 들어간 원소와 x가 같으면 pop
if stack[-1] == x:
stack.pop()
# 그렇지 않으면
else:
stack.append(x)
if len(stack) == 0:
return 1
else:
return 0
def solution(s):
stack = []
for x in s:
# 스택에 문자가 남아있고,
# 가장 마지막에 들어간 문자가 x보다 사전순으로 앞에 오는 문자일 경우 pop
while len(stack) > 0 and stack[-1] < x:
stack.pop()
stack.append(x)
return ''.join(stack)
import itertools
import math
def solution(monster, S1, S2, S3):
monster.sort()
game_map = [0] * (monster[-1] + 1)
for m in monster:
game_map[m] = 1
# 몬스터를 만나지 않는 경우
not_mon = 0
for i in range(1, S1 + 1):
for j in range(1, S2 + 1):
for k in range(1, S3 + 1):
sum_value = i + j + k + 1
if sum_value > monster[-1]:
not_mon += 1
elif game_map[sum_value] == 0:
not_mon += 1
total = S1 * S2 * S3
return math.floor((not_mon / total) * 1000)
def solution(brown, red):
carpet = brown + red
# 전체 격자의 수 carpet의 약수 쌍을 구한다
c = [(i, carpet // i) for i in range(2, int(carpet ** 0.5) + 1) if carpet % i == 0]
# 가로, 세로의 길이로 brown을 만들 수 있는지 확인한다
for a, b in c:
if (a * 2) + (b * 2) - 4 == brown:
return [b, a]
import itertools
def solution(m, weights):
candidates = []
for i in range(1, len(weights)):
candidates += map(sum, itertools.combinations(weights, i))
return len([c for c in candidates if c == m])
import math
from collections import deque
def solution(progresses, speeds):
answer = []
# 남은 작업일을 먼저 계산해두자
days_left = [math.ceil((100 - i) / j) for i, j in zip(progresses, speeds)]
queue = deque(days_left)
while queue:
max_days = queue.popleft()
result = 1
while queue:
next_days = queue[0]
# 다음 작업의 남은 일수가 max_days보다 작을 경우
# 배포될 작업 개수 + 1
if max_days >= next_days:
result += 1
queue.popleft()
else:
answer.append(result)
break
if not queue:
answer.append(result)
return answer
def solution(A,B):
A.sort()
B.sort(reverse=True)
return sum([a * b for a, b in zip(A, B)])