반응형

BFS 5

[백준_BOJ] 2573. 빙산 _ JAVA

문제 풀이 빙산이 두 덩어리 이상으로 나뉘는 데에 걸리는 시간을 구하는 문제입니다. 이 문제를 풀이할 때 사용한 주요 로직은 위와 같습니다. while문을 이용해 빙산의 조각이 두 덩어리 이상으로 나뉘거나, 모두 녹아 사라질 때까지 반복합니다. 1. melting() : 빙산이 사라질 만큼을 계산해주어야 합니다. 계산을 위해 사용할 배열 copy를 만들어 준 뒤, 상, 하, 좌, 우에 위치한 0을 카운트하여 copy 배열에 저장해주었습니다. 2. calc() : 사라질 빙산이 계산되었다면, copy 배열의 정보를 이용해 빙산을 없애주었습니다. 빙산의 양보다 사라질 양이 많다면 0으로 저장하도록 해주었습니다. 3. checkLand() : 빙산의 덩어리 수를 계산하는 함수입니다. BFS를 이용하여 현재 맵..

알고리즘 연습 2019.12.31

[ 백준_BOJ ] 2636. 치즈 _ 문제풀이 JAVA

문제 풀이 #1. Input( ) 부분 치즈가 있는 부분을 map 배열에 1로 표시해주었고 치즈 수를 세기 위해 cheese 변수를 1씩 ++해주었습니다. #2. Main 부분 Main에서는 while 문에서 치즈의 갯수가 0이 아닐 때까지 Melting( )과 Clear( ) 함수를 계속 반복합니다. 치즈가 모두 녹아서 사라지는 데 걸린 시간을 알기 위해 Time 변수를 while문을 실행할 때마다 1씩 늘려주었고, 모두 녹기 전에 ( Cheeze가 0이 되기 전 ) 남아 있던 치즈의 갯수를 알기 위해 Ctmp 변수에 이전 치즈 값을 저장하였습니다. #3. Melting( ) 부분 이 문제에서 판의 테두리 'X' 부분에는 치즈가 위치하지 않습니다. 이를 이용하여 '치즈가 없는 바깥 부분, 또는 치즈가 ..

알고리즘 연습 2019.10.23

[ SWEA ] 1868. 파핑파핑 지뢰찾기 _ JAVA 문제풀이

풀이 이 문제 풀이는 크게 두 가지 분류로 나뉘지 않았을까 싶습니다. 1. 지뢰의 위치에서 시작하여 방문해야 할 지점들을 체크하는 경우와 2. 주변에 지뢰가 없는 ( 지뢰의 갯수 0 ) 지점의 갯수를 체크하는 경우로 나뉠 것 같습니다. 저 같은 경우에는 2번의 경우로 풀이하였습니다. 1 -> 주변에 지뢰가 없는 지점들 ( 0인 지점 ) 을 BFS를 이용해 해당 지점들을 '#'으로 바꿔주었습니다. --> Check( ) 함수를 이용해 주변에 지뢰가 없는 지역임을 확인하였습니다. --> 이 경우 한 번 클릭해야 하므로 cnt++을 해주었습니다. 2 -> BFS로 0이 되는 인근 지역들을 모두 제거해주었다면 지뢰 ( * ) , 지뢰 갯수 0 ( # ) 이 아닌 ( . ) 의 갯수를 cnt++ 해주어 정답을 찾..

알고리즘 연습 2019.10.16

[백준_BOJ] 3055. 탈출 _ Java

문제 풀이 BFS를 활용해야 하는 문제입니다. 주어진 맵 정보에 대하여 매 시간별 물이 차오르는 정보를 업데이트 해주어야 하고, 고슴도치는 한 칸씩 이동할 수 있습니다. 따라서 저는 먼저 fire() 함수를 통해 물이 차오르는 범위를 업데이트를 해준 뒤, bfs 함수로 고슴도치가 한 칸씩 이동할 수 있도록 해주었습니다. ※ 주의할 점 하나는 물이 차오른 뒤에 고슴도치를 이동시켜야 정상적으로 이동할 수 있기 때문에 bfs 함수 실행 전 fire 함수를 먼저 실행해주었습니다. ※ 주의할 점 두 번째로는 고슴도치가 비버의 굴로 이동할 수 없는 경우도 발생하기 때문에 이동하지 못하는 경우와 이동할 수 있는 경우를 위해 flag 변수를 활용하였습니다. while문의 조건으로 1. 아직 도달하지 못했을 때 ( ! ..

알고리즘 연습 2019.10.09

[ 그래프 ] BFS 연습하기 JAVA

문제 그림과 같은 그래프에 대하여 정점의 개수 N, 연결선의 개수 M이 주어지고 그래프에 대한 연결 정보가 주어질 때, 시작 정점 1에서 BFS 방문 경로를 출력하시오. 풀이 BFS를 연습하는 가장 기본적인 문제입니다. 시작 정점 1을 bfs() 함수 실행할 때 입력해준 뒤, Queue를 이용하여 다음 정점과 연결되어 있고 ( map[x][i] == 1 ), 아직 방문하지 않은 정점이 있다면 ( visited[i] == false ) 큐에 해당 정점을 넣어주고, 더 이상 방문할 정점이 존재하지 않는다면 종료해주었습니다. 연결되어 있는 모든 정점을 너비 우선 탐색(Breadth First Search)으로 방문하는 문제입니다. 방문한 정점에 대하여 중복 방문하는 경우를 방지하기 위해 visited 배열을 ..

알고리즘 연습 2019.10.07
반응형