210420 - 올바른괄호 외

golden boy·2021년 4월 20일
0

algorithm

목록 보기
1/3

내가 짠 코드는 아니고 다른 사람이 짠 코드를 이해한 후 뜯어 보았다.

# 올바른 괄호 코드, 풀이

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)
profile
벽을넘자

0개의 댓글