7/27 미경이 스터디

코변·2022년 7월 27일
0
post-thumbnail

Photo by Pietro Mattia on Unsplash

올바른 괄호

from collections import deque
def solution(s):
    check_right_parentheses = deque(list(s))
    last_parenth = []
    while check_right_parentheses:
        cur_parenth = check_right_parentheses.popleft()
        if len(last_parenth) == 0 and cur_parenth == ')':
            return False
        elif len(last_parenth) !=0 and cur_parenth != last_parenth[-1]:
            last_parenth.pop()
        else:
            last_parenth.append(cur_parenth)
            
    if len(last_parenth) > 0:
        return False
    return True

내가 이해한 룰

  1. 괄호로 이루어진 리스트가 주어진다.
  2. 이 괄호가 올바른 괄호 형태로 짝지어져 있는지 검사한다.
    생각해봐야할 조건들
    2-1. ')'괄호가 처음부터 나오는 경우
    2-2. '(',')','(' 이와 같이 갯수가 맞지 않은경우
    2-3. ')' '(' ')', '(' 이와같이 갯수는 맞으나 짝이 맺어져 있지 않은 경우

문제풀이

2-1 조건을 고려

  1. 이전 값을 저장해둔 스택의 길이가 0일 때 닫는 괄호가 나온다면 바로 False를 반환하도록 했다.

2-2, 2-3 조건을 고려

  1. 짝이 맞으면 이전값 스택에서 pop을 해준다.
  2. 짝이 맞지 않으면 스택에 담는다.
  3. 모든 괄호를 다 뽑아냈다면 while문을 종료하고
  4. 종료한 후에 이전값을 담는 스택에 값이 남아 있다면 False를
  5. 스택에 값이 없다면 True를 반환한다.

네트워크

def dfs(visited, computers, node):
    if visited[node] == 0:
        visited[node] = 1
        for idx, is_network in enumerate(computers[node]):
            if visited[idx] == 0 and is_network:
                dfs(visited, computers, idx)
        return True
    return False

def solution(n, computers):
    cnt = 0
    visited = [0] * n
    for i in range(n):
        if dfs(visited, computers, i):
            cnt+=1
    return cnt

내가 이해한 룰

  1. 컴퓨터가 서로 이어져 있다면 같은 네트워크를 공유하고 있는것이다.
  2. 컴퓨터는 자기 자신에 대해서 네트워크를 공유하고 있다.
  3. 네트워크에 대한 정보가 2차원 리스트로 주어진다.
  4. 네트워크들의 갯수를 구하라

문제풀이

  1. bfs로 풀려고 했으나 내가 dfs보다 bfs를 더 선호하는 것 같아서 dfs로 풀어보았다.(연습을 위해)
  2. 컴퓨터 갯수가 주어지기 때문에 이를 활용해서 visited를 초기화 해준다.
  3. dfs 로직을 분리하여 함수로 만들어주고 재귀 함수로 구현해준다.
  4. 재귀함수는 들어온 컴퓨터의 인덱스 값을 토대로 연결되어 있는 모든 값들을 순회하면서 visited의 값을 1로 바꾸어준다.
  5. 한번 dfs를 거치고 나면 연결된 모든 컴퓨터들의 visited 값은 1이 되므로 연결되지 않은 값들만 dfs로직 안을로 들어오게 된다.
  6. 따라서 dfs가 true를 반환할 때만 cnt값을 1올려주면 네트워크의 수를 구할 수 있다.

더 맵게

import heapq
def solution(scoville, K):
    cnt = 0
    heapq.heapify(scoville)
    while scoville:
        first = heapq.heappop(scoville)
        if first >= K: return cnt
        if len(scoville) == 0: return -1
        second = heapq.heappop(scoville)
        new_food = (first + (second*2))
        scoville.append(new_food)
        cnt+=1
    return -1

내가 이해한 룰

  1. 주어진 리스트의 최소값 두개를 뽑아내서 그 두 값을 가지고 다음과 같은 식으로 계산한 뒤 다시 list에 넣어준다.
  2. 제일 작은값 + (두번째로 작은값 *2)
  3. 위 로직을 제일 작은값이 k이상일 때까지 반복한다.
  4. 만약 k이상을 만들 수 없다면 -1을 반환한다.

문제풀이

  1. 이 문제는 최소힙 문제로 python의 heapq를 이용하면 된다.
  2. 최소값 두 개를 heqpq.pop() 함수를 통해서 뽑아주고
  3. 그 값에 위에서 주어진 연산을 해준다.
  4. heapq.push를 할 수도 있겠지만 최종 검사에서 크게 차이가 나지 않을 것 같아서 그냥 append를 해주었다.
  5. 스코빌이 비었음에도 마지막값이 k보다 작다면 -1을 반환해주고
  6. 제일 작은 값이 k보다 크거나 같다면 cnt를 반한해준다.
  7. 마지막으로 이 조건들을 통과하면 한번 연산을 마친 것이기 때문에 1을 더해준다.
  8. heapq.heapify(scoville)를 하지 않으면 검사에 통과하지 못한다.
  9. heap.push로 만들어진 리스트가 아니기 때문에 힙의 형태로 바꿔주어야 하기 때문으로 보인다.
profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글