BFS 29

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

이 문제는 BFS를 활용한 문제였다. 문제를 맨처음 접했을 때 당연하게 2차원 visit배열을 이용하여 벽을 만났을 때 현재 위치에서 남은 벽 부수는 횟수를 이용하여 단순하게 벽을 부수는 방법으로 접근을 하였다. 이러한 경우 다음과 같은 문제점이 발생하게 된다. 0 1 1 1 0 0 1 0 이러한 맵이 부술수 있는 벽이 1개 존재한다고 가정하자. 이 상황에서 최단 거리는 당연히 직관적으로 (1,1) -> (2,1) -> (2,2) -> (2,3 부수기) -> (2,4)를 확인 할 수가 있다. 다만 맨처음에 접근했던 방법을 이용하여 BFS를 돌았을 때 단지 벽부는 횟수만 체크하게 된다면 (1,1) -> (1,2 부수기) -> (2,2) 에서 끝나는 상황을 충분히 마주치게 된다. 그러므로 벽 부수는 것에 대..

Algorithm 2021.05.16

[BOJ] 2644. 촌수계산

그래프의 BFS문제이다. List의 배열을 이용한 간단한 그래프 BFS 문제였다. 촌수를 구하기 위해 visit배열을 -1로 초기화 시켰고 start부터 시작하여 end가 만날때까지 실행을 시켰다. 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 package study4; import java.io.BufferedReader; import java.io.InputStreamReader; impor..

Algorithm 2020.08.11

[BOJ] 1525. 퍼즐

BFS를 이용하여 모든 경우를 탐색해는 방식으로 해결한 문제이다. 전체 퍼즐이 가지는 경우의 수가 9! 가지이므로 전체 경우를 다봐보는 경우를 생각해보았다. 일단 주어진 입력을 보았을때 0을 움직이는 BFS를 생각할수 있었다. 그렇게 하여 생각해낸것이 움직여서 나올 수 있는 2차원 배열 모양을 하나의 경우로 생각하였고, 0이 움직일수 있는 위치는 4방향이어서 하나의 2차원 배열에서 최대 4가지 모양을 가질수있다고 생각하였다. 그러한 모양에 대해 방문체크를 해주어야 했는데, 2차원 배열을 int의 형태로 만들어서 체크를 해주었다. 즉, 123456780 부터 087654321 까지의 숫자로 만들어주었고, 0이 맨앞에 오는 경우때문에 0을 9로 대체하여 구했다. visit을 만들때 문제가 있었는데 이땐 Ma..

Algorithm 2020.06.04

[BOJ] 2931. 가스관

BFS를 이용하여 빈칸을 찾는 문제이다. M에서 시작하여 다음파이프로 이동하면서 만나는 첫번째 빈칸에서 적합한 파이프를 찾는 문제이다. 그 빈칸의 파이프는 해당 빈칸과 연결된 모든 파이프들을 서로 연결시킬수 있는 모양이므로 체크해줘야할 조건이 상당히 많았다. 조건을 체크하는 과정에서 어이없게 실수하는 부분이 있어서 상당히 오랜시간 푼 문제였다. 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..

Algorithm 2020.06.01

[BOJ] 17471. 게리맨더링

조합과 그래프탐색을 하는 시뮬레이션 문제이다. 이 문제를 접근할때 단순하게 생각하여 접근하였다. 일단 모든 도시들의 연결관계를 그래프를 이용하여 나타내주었고, 그후 도시들을 조합으로 1개부터 N/2개를 만큼 선택을 하였다. 그 후 같은 팀이된 도시들끼리 DFS로 이어져있는지 확인하였고 만일 같은팀이 전부 이어져있는 형태를 그린다면 그때의 인구수 차이를 체크해주었다. 다양한 것을 구현해야하고 구현하는 서순이 복잡하지만 천천히 하나씩 구현해보았다. 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 ..

Algorithm 2020.05.30

[BOJ] 17142. 연구소 3

이문제는 조합을 이용하여 선택을 한다음 BFS를 사용하는 문제이다. 조합을 사용하여 바이러스의 위치를 뽑아주고, 그 다음 map에서 그위치를 활성화 시켜준 다음 BFS를 돌았다. 그 후 다시 map을 비활성화 시켜주는 작업을 하였다. 이 문제에서 현재 빈칸이 있는지 check를 할 때 맨처음에는 전체를 다보는 식으로 하였는데 시간초과의 결과를 얻었었다. 그래서 맨처음 입력받을때 빈칸의 갯수를 세어놓고 BFS를 돈다음 그 BFS를 도는 칸이 전체 빈칸의 갯수랑 같다면 true라고 생각해주고 답을 찾아주었다. 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 4..

Algorithm 2020.05.29

[BOJ] 11967. 불켜기

간단한 BFS 문제 같지만 방문고려요소가 상당히 많은 문제이다. 방문을 위한 조건이 1. 현재방에서 인접한 방이고 2. 불이 켜져있어야 함으로 배열을 near,light,visit로 세가지를 만들었다. 그리고 0,0에서 시작 후 첫번째로 near를 이용하여 근접한 방을 체크해주었고, 두번째로 현재방에서 불을 킬수있는 방을 불을 키면서 near이면 queue에 넣어주었다. 그후 세번째로 현재방에서 다시 근접한 불켜진 방들을 방문하였다. 이러한 방식을 이용하여 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..

Algorithm 2020.05.21

[BOJ] 17135. 캐슬 디펜스

조합과 BFS를 이용하여 반복하는 문제이다. 이 문제는 조합을 이용하여 궁수의 위치 3가지를 뽑고, 그 위치에서 BFS를 이용하여 거리 D안에 있는 적들을 PriorityQueue에 집어 넣어 계속 쳐치해가며 map상에 모든 적이 사라질때의 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..

Algorithm 2020.05.13

[BOJ] 16236. 아기 상어

BFS를 이용한 문제이다. 이 문제에선 다음에 갈 점들의 우선순의가 거리>위쪽>왼쪽 으로 주어져있으므로 다음에 갈점을 위해 PriorityQueue를 사용하였다. BFS를 한번 돌때마다 pq에 갈점들을 쭉저장하고 pq가 없다면 멈추는 형식으로 구현하였다. 문제를 이해하는데 오래걸렸다. 문제를 꼼꼼히 읽는 습관이 필요할 것 같다. 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 ..

Algorithm 2020.05.11