내가 짠 코드는 아니고 다른 사람이 짠 코드를 이해한 후 뜯어 보았다.
# 올바른 괄호 코드, 풀이
def solution(s):
deque = [] # 빈 덱 생성
for i in s: # 주어진 괄호 하나씩 추출
if i == '(': # 왼쪽 괄호면
deque.append(i) # 빈 덱에 넣는다.
else:
try: deque.pop() # 오른쪽 괄호면 덱에 있는 것을 하나 뽑아낸다.
except: return False # 뽑아낼 것이 없으면 False를 출력한다.
if len(deque) == 0: # 다 돌리고 난 후 덱에 아무것도 없으면
return True # 올바른 괄호
else:
return False # 그렇지 않으면 틀린 괄호
# 스킬트리 코드, 풀이
def solution(skill, skill_trees):
answer = 0
for skills in skill_trees: # 스킬 묶음에서 스킬을 하나씩 뽑는다
COMP = [] # 비교할 빈 리스트 만들기
for i in skills: # 개별 스킬을 하나씩 뽑아서
if i in skill: # 스킬트리 안에 그 스킬이 있으면
COMP.append(i) # 비교리스트에 넣는다.
if skill == COMP: # 만일 비교리스트와 스킬트리가 일치하면
answer += 1 # 사용 가능하므로 +1
flag = True # 비교용 변수를 하나 생성한다.
for i in range(len(COMP)): # 비교용 리스트 내의 개별스킬 갯수만큼 돌린다
if COMP[i] != skill[i]: # 만일 돌리는 중에 비교리스트와 스킬트리 값이 다르면
flag = False # 깃발을 바꾼다. (스킬트리를 벗어나 사용 불가함)
break
if flag == True: # 다 끝낸 후 깃발이 True 상태면
answer += 1 # 가능한 스킬트리 이므로 +1
return answer # 모두 체크한 후 마지막에 가능한 스킬트리 갯수를 출력한다.
#배상 비용 최적화, 힙 모듈 사용
import heapq
def solution(no, works):
if no > sum(works): # 만일 남은 시간이 작업량 총 합보다 크면 배상이 필요 없으므로 0 반환
return 0
works = [(-i, i) for i in works]
heapq.heapify(works) # 힙 형태로 바꿔준다. 위에서 -를 붙여 놓아 정렬이 반대로 된다. 가장 큰 값부터 1씩 빼줘야 하니까
# print(works)
for i in range(no):
w = heapq.heappop(works)[1] -1 # heappop은 맨 앞의 값을 뽑는다. 뽑아서 1을 뺀 후
# print(works)
heapq.heappush(works, (-w, w)) # 맨 뒤로 넣어준다. push는 뒤로 입력함.
# print(works)
return sum((i[1]**2) for i in works) # 다 빼주고 남은 값들을 제곱한 다음 더하면 배상해야 하는 값이 나온다.
# 배상비용 최적화 다른 풀이, 효율성은 떨어짐
# 다른 풀이, 정렬을 계속 해야 해서 효율성에선 좋지 않다.
def solution(no, works):
if no > sum(works): # 만일 남은 시간이 작업량 총 합보다 크면 배상이 필요 없으므로 0 반환
return 0
for i in range(no):
works.sort()
works[-1] -= 1
return sum((i**2) for i in works)