python3

    [python3] 1167 풀이 (트리의 지름, 트리, DFS)

    [python3] 1167 풀이 (트리의 지름, 트리, DFS)

    문제가 어려워서 힌트를 봤고 이해하고 나니 쉽게 풀 수 있었다. 트리가 주어진다. 이때 트리의 지름을 구하는 문제이다. 트리의 지름을 어떻게 구해야하는지 이해하지 못하면 풀수가 없다. 트리가 주어졌을대 트리의 지름을 구하기 위해서는 가장 끝점을 알아내야한다. 처음에는 각 노드마다 다익스트라를 할지 플로이드를 할지 고민했다. 그런데 주어지는 노드가 100,000개이기 때문에 구할 수가 없다. 따라서 다른 방법을 사용해야한다. 그래서 이리저리 지지고 볶으니 한줄로 세우는 방법이면 되지 않을까 싶었다. 그래서 한줄로 세워보았다. 그런데 이렇게 세운다고 달라지지가 않았다. 더이상 고민하는게 무의미하여 찾아보니 아무 노드나 잡고 가장 먼것을 찾아본다. 그럼 지름의 끝 노드를 찾을 수 있었다. 만약 3번 노드에서 ..

    [python3] 행렬 다루기 (zip, *, 행렬)

    [python3] 행렬 다루기 (zip, *, 행렬)

    코테를 풀다보면 [[1,2] [3,4]] 를 [[1,3] [2,4]]로 바꾸고 싶을때가 있다. 물론 코딩을 통해 하나씩 옮겨주는 방법도 있지만 문제는 이런 사소한 부분들을 신경쓰다보면 이상하게 말리는 경우가 생긴다는 것이다. python 행렬 전치를 구글링하면 numpy를 사용하여 전치하는 예시들이 나오는데, 코딩테스트에서는 이런 외부 라이브러리를 사용하지 못하는 경우가 발생한다. 이때를 대비하기 위해 행렬을 다루는 방법을 알아본다. 행렬 전치하기 a = [ [1,2] , [3,4] ] b = list(zip(*a)) for tmp in b: print(tmp) # (1,3) # (2,4) zip(*배열) 을 사용해주면 간단히 행과 열을 바꿔줄 수 있다. 행렬 회전하기 방금 우리는 zip을 통해 행렬을 ..

    [python3] binary string to integer, integer to binary string

    def intToBin(val): # 정수값을 bin함수로 바꾸면 bin(4) => '0b100' 앞쪽에 0b가 붙어서 나오므로 이걸 제거해준다. return bin(val)[2:] def binToInt(strval): # "100" => 4가 된다. int함수의 두번쨰 인자를 2로 놓으면 바이너리, 16으로 놓으면 16진수 값으로 변경된다. return int(strval, 2)

    [python3] 백준 1389 풀이 ( 케빈 베이컨의 6단계 법칙, 플로이드 워샬 )

    [python3] 백준 1389 풀이 ( 케빈 베이컨의 6단계 법칙, 플로이드 워샬 )

    이번 문제는 케빈 베이컨의 6단계 법칙이다. 케빈 베이컨이 할리우드의 핵 인싸라는 것을 인지하고 문제에 들어가자. 문제를 보자 문제가 상당히 길다. 읽어보면 그냥 네트워크 안에서 여러 사람들과 연결되어 있을때 모든 타인과 몇번만에 연결되어 있는지를 알아내어 최솟값을 가지는 즉, 허브 역할을 하는 사람을 구하면 된다. 문제를 잘 읽어보면 결국 N정점에서 N정점으로의 갈 때 얼마나 걸리는지를 구해야 한다. 그래야 한 노드에서 모든 노드에 방문할 때 케빈 베이컨의 수를 구할 수 있다. 즉, 모든 쌍 최단 거리 알고리즘을 사용하면 구할 수 있다. 모든 쌍 최단 거리 알고리즘의 대표적인 놈이 "플로이드 워샬"이다. 그러나! 플로이드 워샬은 O(N^3)이 걸리기 때문에 N값이 너무 크면 문제가 발생할 수 있다. 다..

    [python3] 백준 16236 풀이 ( 아기상어, 그래프, BFS, sort, pq? )

    [python3] 백준 16236 풀이 ( 아기상어, 그래프, BFS, sort, pq? )

    이번 문제도 역시나 좀 헤맸다. 이번 문제는 BFS로 쉽게 풀릴 줄 알고 살짝 깝쳐 봤으나 역시나 생각치 못한 케이스가 존재해서 결국 다시 코딩한 문제이다. 문제를 쓰악 읽어보자. 우선 문제는 아기상어의 성장에 관한 이야기다. 스토리처럼 느껴져서 문제 읽는 동안 재밌었다. 여튼 문제에서 나오는건 아기 상어가 성장하기 위해서 물고기를 먹어야한다. 그런데 먹이를 먹는데 여러 조건이 존재한다. 조건 1. 먹을 수 있어야함. (자기보다 크기가 작아야함.) 2. 거리가 가까워야 함. 3. 위 물고기 선호 4. 왼쪽 물고기 선호 1번 조건과 2번 조건은 BFS로 최단 경로를 찾으며 먹을 수 있는 물고기를 찾으면 된다. 3번 조건과 4번 조건은 같은 거리에 존재하는 물고기들의 좌표를 비교하여 조건에 맞는 물고기부터 ..

    [python3] 백준 1520 풀이 ( 내리막길, DP, DFS, 그래프 )

    [python3] 백준 1520 풀이 ( 내리막길, DP, DFS, 그래프 )

    이번 문제 풀이 사실 봐버렸다. 거의 풀었다고 생각했는데 내가 생각한 방법으로는 도저히 풀리지가 않아서 그냥 풀이를 봤다. 바로 문제를 보자 문제를 읽어보면 낮은 방향으로만 진행한다고 한다. -> 사이클이 존재하지 않는 그래프이다. 가장 빠른게 도착하는게 아닌 도착하는 경우의 수를 구한다. -> BFS가 아닌 DFS를 여러 번 써야한다. 문제를 통해 2가지를 확인할 수 있다. 그런데 DFS만을 쓰는 경우에는 너무 많은 케이스가 존재한다. 실제로 DFS만으로 제출한다면 시간초과가 뜬다. 따라서 DFS만이 아닌 DP를 함께 활용해 주어야한다. 그럼 DP를 어떻게 활용해야 할지 고민을 해본다. DFS만 써서 시간초과가 나는 것은 빙빙 돌아 목적지에 도착하는 경우까지 기다려야 하기 때문이다. 그렇다면 빙빙 돌아..