BFS 29

[SWEA] 5656. 벽돌 깨기

주어진 구슬 N의 최대 크기가 4, 너비 W가 12이므로 모든 경우의 수를 구할 때 순열을 사용하여도 복잡도가 넘어 갈 것 같지 않아서 바로 순열을 사용하였다. 순열을 선택한 후 다음과 같은 과정을 계획하였다. 1. W에서 N개를 선택하는 모든 수열을 구한다. 2-1. 구한 순열의 경우의 수마다 위에서 부터 폭파하는 과정을 BFS를 통하여 계산한다. 2-2. 폭파된 후 중간에 공백을 아래로 당겨준다. 그 후 2-1 반복한다. 3. 모든 폭파가 종료된 후 살아있는 블럭을 카운팅해준다. 또한, 중간에 최적화를 시키기 위해, 만일 2-1 과정에서 선택한 열의 블록이 하나도 없는 경우, 그 순열의 경우는 바로 종료 시키게 해주었다. 문제를 읽고 있는 그대로 차분하게 구현하여서 답을 얻을 수 있었다. 1 2 3 ..

Algorithm 2020.03.24

[SWEA] 1868. 파핑파핑 지뢰찾기

BFS를 사용하는 문제이다. 해당 칸의 값이 0이면 8칸의 값을 무조건 방문해줘야하기에 전체 배열을 돌면서 0인 곳을 찾아서 방문해주는 BFS 로직을 우선 사용하였다. 그리고 모든 방문이 끝난후 아직 방문하지 않고, 빈칸인 경우들의 대해서 count를 추가해주는 과정을 거쳐 답을 구하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 8..

Algorithm 2020.03.23

[BOJ] 2146. 다리 만들기

두번의 BFS를 이용하였다. 첫번째 BFS로 각 섬마다 번호를 지정해주었고, isEdge라른 함수를 이용하여 현재 위치가 가장 자리인 것이 확인이 되면 두번째 BFS를 사용하여 다른 섬까지의 거리를 구해주는 방식으로 해결하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 ..

Algorithm 2020.03.21

[BOJ] 12851. 숨바꼭질2

BFS를 사용하는 문제이다. 다른 숨바꼭질 시리즈와 다르게 몇가지 경로로 목적지에 도달할 수 있냐를 체크해야 함으로 visit 체크를 queue에 offer할 때가 아니라 queue에 poll 할때 체크해주었다. 또한, 처음 도달한 경우가 최솟값이므로 그 값을 이용하는 과정을 거쳤다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 package..

Algorithm 2020.03.18

[BOJ] 1600. 말이 되고픈 원숭이

BFS를 사용하여 최단 시간을 찾는 문제이다. 단, 일반적인 BFS와는 다르게 움직일때 두가지(일반, 말) 방법으로 움직이게 되고, 말처럼 움직이는 경우는 횟수가 제한이된다. 따라서 visit 배열을 3차원으로 visit[행][열][말처럼 움직일수 있는 남은 횟수] 로 만들어서, 구한다. 그리고 queue에서 poll 할때 도착지점인 경우 result와의 최솟값을 비교해주어서 답을 구한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 6..

Algorithm 2020.03.18

[BOJ] 13549. 숨바꼭질3

BFS를 사용하여 최단 시간을 찾는 문제이다. 이 문제는 일반 BFS와 다르게 풀어야 한다. 일반적인 BFS를 하기 위해선 모든 간선의 가중치가 동일해야 한다는 전제 조건이 필요하다. 그러나 이문제는 가중치가 0이 존재하므로 단순한 BFS를 사용할 수 없고, 다음과 같은 방법으로 풀수 있다. - 다익스트라 알고리즘 : 모든 간선이 다를 경우 사용하기 용이 - 0-1 BFS : 가중치가 0인 간선에 연결된 정점은 큐의 맨뒤가 아닌 맨앞에 넣는 방법 - *2 를 별도의 간선으로 생각하지 않고, +1이나 -1에 의한 좌표의 2의 거듭제곱 배인 좌표들을 전부 큐에 넣는 방법 이 문제에선 간선이 0, 1 두가지 종류여서 다익스트라 알고리즘 보단 Deque을 이용하여 가중치가 0일 때, Deque의 addFirst..

Algorithm 2020.03.15

[BOJ] 2206. 벽 부수고 이동하기

최단거리를 구하는 문제이기에 BFS를 사용하는 문제이다. 이 문제에선 신경써야할 점이 두가지 있다. 첫째, visit[][][]을 이용하여 벽을 뚫지 않은 상태에서랑 벽을 이미 한번 뚫은 상태에서 방문이 가능한지 신경써줘야한다. 둘째, queue에서 poll 할때 목적지 지점이면 최솟값으로 갱신 가능한지 확인하는 것 이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 ..

Algorithm 2020.03.15

[BOJ] 7576. 토마토

BFS를 사용하는 문제이다. 모든 시작점 1을 queue에 집어넣은 다음 평소 boolean배열 형태로 사용하던 visit를 int배열 형태로 바꾸어 토마토가 익은 날짜로 대신하여 사용하였다. 그리고 이미 visit배열이 갱신되었더라도 더 작은 날짜를 가질 수 있다면 갱신할수 있도록 while문 안쪽에서 구현하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 7..

Algorithm 2020.03.10

[SWEA] 7793. 오! 나의 여신님

BFS를 두번 사용할 계획을 세웠다. 첫번째 BFS를 통하여 모든 악마를 찾아 스킬이 도달하는 최단시간을 visitForDevil 배열에 저장해주었다. 그 후 두번째 BFS를 통해 S의 위치를 찾아 S가 n초 후에 도달할 수 있는 .의 위치에서 visitForDevil의 시간을 비교하여 도달여부를 결정하였다. 이런식으로 D를 찾으면 종료하였고, 못 찾으면 GameOver를 해주었다. 그렇지만 두번 BFS를 도는 방법 말고도, 구분자를 사용하여 악마와 S를 하나의 BFS에서 처리할 수 있는 방법도 있다.(단, 악마가 queue에 S보다 먼저 들어가 있어야함). 이 방법은 코드를 더 짧게 해주고, 시간도 더 줄여줄 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1..

Algorithm 2020.03.10