BFS
-
[백준] 17086번 아기 상어 2 (by Python)Programming/Algorithm 2021. 4. 11. 18:00
문제 https://www.acmicpc.net/problem/17086 17086번: 아기 상어 2 첫째 줄에 공간의 크기 N과 M(2 ≤ N, M ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 공간의 상태가 주어지며, 0은 빈 칸, 1은 아기 상어가 있는 칸이다. 빈 칸의 개수가 한 개 이상인 입력만 주어진다. www.acmicpc.net 풀이 처음에는 각 칸에서 최소 거리를 구하는 아이디어를 떠올렸지만 computation cost가 너무 클 것 같다는 생각이 들었다. 그래서 빈칸에서 상어까지의 거리를 구할 것이 아니라 상어로부터 각 칸의 최소 거리를 propagate하는 방식으로 저장하면 보다 효율적일 것 같다고 생각했고, 다행히 시간 초과에 걸리지 않았다. import sys from coll..
-
[백준] 1303번 전쟁 - 전투 (by Python)Programming/Algorithm 2021. 4. 11. 17:40
문제 https://www.acmicpc.net/problem/1303 1303번: 전쟁 - 전투 첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는 www.acmicpc.net 풀이 전쟁터의 원소들을 하나하나 짚어나가면서 방문한 적이 없는 원소일 경우 방문해서 인접해있는 모든 같은 팀의 병사들을 BFS를 통해서 찾은 후에 병사들의 수를 제곱한 수를 해당하는 팀에 넣어준다. 그리고 나서 각 팀의 배열에 들어있는 수들을 모두 합해서 출력해주면 문제 해결~! import sys from collections import deque input = ..
-
[백준] 18404번 현명한 나이트 (by Python)Programming/Algorithm 2021. 3. 14. 15:33
문제 https://www.acmicpc.net/problem/18404 18404번: 현명한 나이트 첫째 줄에 N과 M이 공백을 기준으로 구분되어 자연수로 주어진다. (1 ≤ N ≤ 500, 1 ≤ M ≤ 1,000) 둘째 줄에 나이트의 위치 (X, Y)를 의미하는 X와 Y가 공백을 기준으로 구분되어 자연수로 주어진다. ( www.acmicpc.net 풀이 움직이는 방식이 일반적인 상하좌우가 아니라 체스의 나이트가 움직이는 방식이라는 점에서 차별화되는 BFS 문제이다. 이에 맞추어 step 리스트를 다르게 바꾸어주었다. 또한, 목적지가 하나가 아님에 따라 하나를 찾을 때마다 체크하고 다 찾은 경우에는 while loop을 탈출하도록 코드를 짜주었다. from collections import deque..
-
[백준] 1525번 퍼즐 (by Python)Programming/Algorithm 2021. 3. 5. 17:52
문제 https://www.acmicpc.net/problem/1525 1525번: 퍼즐 세 줄에 걸쳐서 표에 채워져 있는 아홉 개의 수가 주어진다. 한 줄에 세 개의 수가 주어지며, 빈 칸은 0으로 나타낸다. www.acmicpc.net 풀이 from collections import deque s = '' goal = '123456780' for _ in range(3): s += ''.join(input().split()) visited = {s: True} adj = [[1, 3], [0, 2, 4], [1, 5], [0, 4, 6], [1, 3, 5, 7], [2, 4, 8], [3, 7], [4, 6, 8], [5, 7]] ans = -1 time = 0 q = deque() q.append(..
-
[백준] 3055번 탈출 (by Python)Programming/Algorithm 2021. 2. 11. 02:12
문제 BFS 문제에서 길을 찾아가는 주체뿐만 아니라 갈 수 없는 길까지 큐를 이용해서 업데이트해주어야 하는 문제. 생각이 부족한 탓에 시간 초과 + 디버깅의 헬파티로 힘든 시간을 보냈다... 시간 초과로 문제를 원망하고 파이썬을 원망했지만 프로그래머로서 올바른 자세는 내 머리를 원망해보자는 생각.... 풀이 from collections import deque import sys input = sys.stdin.readline r, c = map(int, input().split()) forest = [list(input().strip()) for _ in range(r)] steps = [(1, 0), (0, 1), (-1, 0), (0, -1)] answer = 0 flag = True q = deq..
-
[백준] 13549번 숨바꼭질 3 (by Python)Programming/Algorithm 2021. 2. 10. 20:16
문제 2*X로 순간이동할 때만 0초가 걸린다는 점이 골머리를 앓게 만드는 문제. 그리고 시간을 더 줄이려면 앞으로 가는 수단은 +1과 *2 2가지가 있지만 뒤로 가는 수단은 -1 하나밖에 없다는 점을 이용해야 한다. 풀이 from collections import deque n, k = map(int, input().split()) if n >= k: print(n - k) else: q = deque([n]) visited = [False] * 100001 next_q = deque() answer = 0 flag = True while flag: if not q: q = next_q next_q = deque() answer += 1 temp = q.popleft() visited[temp] = Tr..
-
[백준] 5014번 스타트링크 (by Python)Programming/Algorithm 2021. 2. 7. 18:04
문제 변수가 많았지만, 문제를 제대로 이해하기만 한다면 간단하게 BFS로 해결할 수 있는 문제이다. 개인적으로 각 변수를 필요한 자리에 놓는 과정이 즐거웠던 문제이다. 풀이 from collections import deque INF = int(1e9) f, s, g, u, d = map(int, input().split()) distance = [INF] * (f + 1) distance[s] = 0 q = deque([s]) while True: if not q: print('use the stairs') break temp = q.popleft() if temp == g: print(distance[temp]) break else: if 0 < (temp + u)
-
[백준] 14226번 이모티콘 (by Python)Programming/Algorithm 2021. 2. 7. 00:48
문제 처음에는 떠오르는대로 BFS로 풀었지만 코드를 짜는 와중에도 뭔가 문제를 다 파악하지 못한 풀이라는 생각이 들었고, 아니나 다를까 나보다 시간을 90% 정도 절약한 분들은 Dynamic Programming을 통해 푸신 분들이었다. 간결한 코드에 끌려 원리를 고민해봤지만 수학적인 증명은 스스로 해내지 못했다. 고민해보았고, 앞으로도 더 고민해보겠지만 지금은 더 다양한 테스트 케이스에서 해당 원리가 적용된다는 확신이 없으므로 이런 유형의 문제를 만났을 때는 확실한 풀이를 먼저 시도해볼 것 같다. 좀 느릴지라도, 스스로 납득되는 코드를 짜고 싶다. 첫 번째 풀이 (by BFS) from collections import deque s = int(input()) q = deque() next_q = de..