파이썬으로 부시자! Python with Coreenee

프로그래머스 - 2019 카카오 개발자 겨울 인턴십 - 튜플

문제

스크린샷 2020-05-08 오후 11 52 03

입력

스크린샷 2020-05-08 오후 11 52 11


나의 처음 코드

중량제한 문제!!! 이분탐색이랑 bfs로 풀 수 있는 문제이다. 자료구조를 어떻게 짜느냐와 어떻게 탐색을 하냐에 따라서 시간초과가 날 수도, 메모리 초과가 날 수도 있다. 나는 간선을 튜플로 저장하였고, bfs에서 pop으로 인한 시간을 줄이면서 문제를 풀었다. 생각보다 까다로운 문제이다… 코드는 다음과 같다.

N, M = list(map(int, input().split()))
map_list = [[] for _ in range(N)]

min_num, max_num = 1000000001, -1
#섬끼리 중량받기
for _ in range(M):
    a,b,c = list(map(int, input().split()))
    map_list[a-1].append((b-1, c))
    map_list[b-1].append((a-1, c))

# print(map_list) 

#공장 2개 입력받기
start, end = list(map(int, input().split()))
start, end = start - 1, end - 1

def bfs(start, end, mid):
    global N
    visited_list = []
    queue_list = [start]
    visited_list.append(start)
    while True:
        tmp_list = []
        for item in queue_list:
            for info in map_list[item]:
                if info[0] not in visited_list and info[1] >= mid:
                    if info[0] == end:
                        return True
                    tmp_list.append(info[0])
                    visited_list.append(info[0])
        queue_list = tmp_list
        if len(queue_list) == 0:
            return False


left, right = 0, 1000000000

while left <= right:
    mid = (left+right)//2
    result = bfs(start, end, mid)
    if result == True:
        left = mid + 1
    else:
        right = mid - 1

print(right)


이분탐색 문제가 요즘 자주나온다,,, 기준을 어떻게 잡냐가 아직도 어렵다,,,