오늘 할 일: 갈고 닦기

탐색

1. Lv1 - 세 소수의 합

def solution(n):
    num = set(range(2, n + 1))
    for i in range(2, n + 1):
        if i in num:
            num -= set(range(2 * i, n + 1, i))

    num = list(num)
    answer = 0

    for i in range(len(num)):
        for j in range(i + 1, len(num)):
            if (n - num[i] - num[j]) in num[j + 1:]:
                answer += 1

    return answer
  • 에라토스테네스의 체 : 시간복잡도는 O(NloglogN), N = 입력으로 주어진 n
  • 소수 구하기 : 시간복잡도는 O(M**3), M = 소수의 개수
  • num 대신 prime_numbers, primes와 같이 명확한 이름을 붙이기

 

2. Lv2 - 카펫

def solution(brown, red):
    total = brown + red

    for height in range(3, total):
        width = total // height
        if total % height != 0 and width <= height:
            continue
        if (height - 2) * (width - 2) == red:
            return [width, height]
  • 시간복잡도 = O(N), N = 전체 격자 수

 

3. Lv2 - 주사위 게임

def solution(monster, S1, S2, S3):
    monster = [i - 1 for i in monster]

    answer = 0
    for i in range(1, S1 + 1):
        for j in range(1, S2 + 1):
            for k in range(1, S3 + 1):
                if i + j + k not in monster:
                    answer += 1

    return int(answer / (S1 * S2 * S3) * 1000)
  • 시간복잡도 = O(N**3)

 

4. Lv3 - 예산

def solution(budgets, M):
    budgets.sort()
    answer = budgets[-1]  

    if sum(budgets) < M:
        return answer
    else:
        while sum(budgets) > M:
            answer = answer - 1
            smaller = sum([budget for budget in budgets if budget < answer])
            answer_sum = answer * len([budget for budget in budgets if budget >= answer])
            temp_sum = smaller + answer_sum
            if temp_sum <= M:
                return answer

    return answer
  • 시간이 오래 걸리는 완전 탐색으로 풀었음 > 이진 탐색을 구현하여 풀어볼 것
  • temp_sum은 `temp_sum = sum(min(budget, answer) for budget in budgets)`으로 줄일 수 있음
  • `while sum(budgets) > M` -> `while True:`
  • early return 다음에는 else문을 쓰지 않아도 됨

 

5. Lv3.5 - 게임 맵 최단거리

from collections import deque

def visitable(n, m, x, y, maps):
    return 0 <= x < n and 0 <= y < m and maps[x][y] == 1

def solution(maps):
    answer = 2
    n = len(maps)
    m = len(maps[0])
    queue = deque()
    queue.append((0, 0))
    maps[0][0] = 0
    DELTAS = ((0, 1), (0, -1), (1, 0), (-1, 0))  # R, L, D, U

    while queue:
        same_depth_queue, queue = queue, []

        for x, y in same_depth_queue:
            for dx, dy in DELTAS:
                next_x, next_y = x + dx, y + dy
                if next_x == n-1 and next_y == m-1:
                    return answer
                elif visitable(n, m, next_x, next_y, maps):
                    # print(next_x, next_y, answer)
                    queue.append((next_x, next_y))
                    maps[next_x][next_y] = 0
        answer += 1
    return -1

 

6. Lv4 - 버스 여행

import numpy as np

def solution(n, signs):
    answer = signs
    cnt = 0
    while cnt <= n:
        arr_multi = np.dot(signs, signs)
        for i in range(n):
            for j in range(n):
                if arr_multi[i][j]:
                    answer[i][j] = 1
        if (arr_multi == answer).all():
            break
        cnt += 1

    return answer
  • 행렬곱의 시간복잡도는 O(NlogN ~ N**2)이며, 최대 n번 반복하므로 전체 복잡도는 O(N**2logN ~ N**3)
  • 다른 접근법도 생각해보기

 

모의고사 - 리뷰 후 수정하기

1. 소수 만들기

from itertools import combinations

def solution(nums):
    prime_set = list(combinations(nums, 3))
    sum_list = list(map(sum, prime_set))
    answer = len(sum_list)

    for sum_value in sum_list:
        for number in range(2, sum_value // 2):
            if sum_value % number == 0:
                answer -= 1
                break
    return answer

 

2. 가로등 - 못 풀었음😂

'OLD > Coding Study' 카테고리의 다른 글

[4주차 정렬, DP] 코드 리뷰  (0) 2020.03.16
[2주차 해시, 스택] 코드 리뷰  (0) 2020.02.28
[1주차 큐, 힙] 코드 리뷰  (0) 2020.02.23
[0주차 모의고사] 스킬 트리  (0) 2020.02.18