본문 바로가기
알고리즘 문제 풀이/Programmers

[10회차]

by 중앙백 2021. 12. 14.

Programmers Level.2 큰 수 만들기

def find_larger(number):
    a = 0
    b = 0
    while b < len(number):
        b += 1
        if b == len(number):
            return b
        if number[b] == number[a] and b == a + 1:
            a += 1
        elif number[b] >= number[a]:
            return b


def solution(number, k):  # 첫째 자리 수와 그 보다 이상인 값 중 첫 번째로 나오는 값을 찾는다.
    number = list(map(int, number))  # 그 사이에서 최솟값을 차례로 지우자.
    while k > 0:  # 지울 게 없다면 첫째 자리수를 지우고, 이 과정을 반복
        position = find_larger(number)
        mins = number.index(min(number[0:position]))
        number.pop(mins)
        k -= 1
    answer = ''
    for i in number:
        answer += str(i)
    return answer

-  내 아이디어는 첫째 자리 수와 다음에 나오는 그 보다 크거나 같은 값 사이에서 값을 하나씩 제거하는 방법이다. 사이에 있는 값 중 최솟값부터 제거하고 제거할게 없으면 첫째 자리 수를 제거한 뒤, 위 과정을 반복한다. 즉, 새롭게 생기는 첫째자리 수와 그 다음에 나오는 크거나 같은 수를 잡고 그 사이의 숫자를 제거하는 과정을 반복. 이렇게 하면 될 줄 알았는데 안되더라. 아이디어가 떠오르지 않아 구글 검색을 통해 해결. (일명 컨닝..)

def solution(number, k):
    answer = []
    for num in number:
        if not answer:
            answer.append(num)
            continue
        if k > 0:
            while answer[-1] < num:
                answer.pop()
                k -= 1
                if not answer or k <= 0:
                    break
        answer.append(num)

    answer = answer[:-k] if k > 0 else answer
    return ''.join(answer)

 - 앞에서 부터 한자리씩 넣으면서 앞자리부터 최댓값을 완성한다는게 아이디어.

 

 

Programmers Level.2 피로도

from itertools import permutations


def cnt_dungeons(k, dungeon_case):
    result = 0
    for dungeon in dungeon_case:
        if k < dungeon[0]:
            return result
        k -= dungeon[1]
        result += 1
    return result


def solution(k, dungeons):
    answer = 0
    for dungeon_case in permutations(dungeons, len(dungeons)):
        if answer < cnt_dungeons(k, dungeon_case):
            answer = cnt_dungeons(k, dungeon_case)
    return answer

 - 아무리 고민해도 생각이 나질 않아서 모든 경우의 수를 탐색해서 풀긴 했는데 이게 맞는 걸까? 언제는 모든 경우를 고려하면 답이 틀리고 언제는 해도 되고... 어렵다. 이 문제의 경우 던전의 수를 8개 제한으로 줬기 때문에 모든 경우를 탐색해도 되긴 했던 듯. 

 

 

Programmers Level.2 배달

import heapq

def solution(N, road, K):
    INF = 500001
    distance = [INF] * (N + 1)
    graph = [[] for _ in range(N + 1)]
    for a, b, c in road:
        graph[a].append((b,c))
        graph[b].append((a,c))
    q = []
    heapq.heappush(q, (0, 1))
    distance[1] = 0
    while q:
        dist, now = heapq.heappop(q)
        if distance[now] < dist:
            continue
        for i in graph[now]:
            cost = dist + i[1]
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))
    answer = 0
    for i in distance:
        if i <= K:
            answer += 1
    return answer

'알고리즘 문제 풀이 > Programmers' 카테고리의 다른 글

[12회차]  (0) 2021.12.16
[11회차]  (0) 2021.12.15
[9회차]  (0) 2021.12.13
[8회차]  (0) 2021.12.12
[7회차]  (0) 2021.12.10

댓글