알고리즘 69

백준[2206] 벽 부수고 이동하기

BFS를 이용하여 해결하는 문제인 것은 알고 있었지만 그냥 최단 거리가 아닌 벽을 하나 부순다는 상황이 주어져서 더욱더 혼란스러워졌다. 2일 동안 생각을 해보고 도전을 해봤지만 실패... 혼자서는 도저히 못 풀겠다는 생각이 들어 인터넷 블로그의 힘을 살짝 빌렸다..ㅠ 다른 사람들이 해결했던 방법들을 보고 이해한 후 문제를 보고 다시 풀었다..... 해결 방법 최단 거리를 측정하는 패턴은 기존 벽을 부수지 않고 이동하는 것과 동일하다. 하지만 최단거리로 가기 위해 벽을 한번 부수려면 모든 벽을 탐지한 후 벽을 부숴야 한다. 출발하자마자 벽을 부수고 가는 것이 최단 거리일 수 있지만 도착지가 벽으로 둘러 싸여 있는 경우 벽 부수는 스킬을 아껴 놓아야 한다. 해당 사례가 아래 그림이다. 출발지 0(a) 0(b..

백준[16928] 뱀과 사다리 게임

BFS를 이용하여 문제에 적힌 규칙을 적용했다. 처음 풀었을 때는 사다리를 만나면 타고 뱀을 타면 무시하는 방법으로 풀었더니 계속 틀렸다. 반례 세 번째 같은 경우가 있어서 뱀을 타고 가는 경우가 있다. 그 외에는 어려운 부분 없이 쉽게 풀 수 있다. #include int slgN, slgM; struct slgMv{ int y; bool visitied; }typedef slgMV; slgMV slgList[101] = {0}; int slgTotalTime = 0; void slgBFS(){ queue slgQ; slgQ.push({1,1}); int dx[] = {1,2,3,4,5,6}; while(!slgQ.empty()){ int x = slgQ.front().first; int time = ..

백준[7569] 토마토

7576번 토마토는 2차원 문제였다면 이번에는 3차원으로 해결하는 문제이다. 2차원 문제를 쉽게 풀었다면 3차원이라고 딱히 막 어렵지 않았다. 2차원 문제와 다른 게 배열범위랑 탐색하는 범위가 살짝 늘어났지만 조금만 생각하면 쉽게 해결할 수 있다. #include #define MAXSIZE 101 int toM3,toN3,toH3; int inBoxSizeV3[MAXSIZE][MAXSIZE][MAXSIZE]; //면, 행, 열 순서 queue tomatoQV3; //면, 행, 열 순서 int tomatoMaxTimeV3 = 0; void toBFSV3(){ int dX[] = {1,-1,0,0,0,0}; int dY[] = {0,0,1,-1,0,0}; int dZ[] = {0,0,0,0,1,-1}; w..

백준[7576] 토마토

처음에 접근을 DFS를 이용하여 토마토 집단이 몇 개인지 알아보고 최소일을 구하는 방식으로 접근했는데 BFS에 대한 이해가 부족했던 것 같다. BFS는 queue에 넣고 반복문을 통해 계산을 진행해서 출발 점이 여러 개여도 큐 안에 미리 넣기만 하면 여러 출발점에서도 동작시킬 수 있다. #include #define MAXBOXLENGTH 1001 int toM,toN; int inBoxSize[MAXBOXLENGTH][MAXBOXLENGTH]; queue tomatoQ; int tomatoMaxTime = 0; void printResult(); void toBFS(){ int dX[4] = {1,-1,0,0}; int dY[4] = {0,0,1,-1}; while(!tomatoQ.empty()){ i..

백준[7562] 나이트의 이동

별다른 문제없이 해결했지만.. 초기화를 할 때 범위를 300이 아닌 301로 지정하여 수십 번 틀렸다..ㅠ 이차원상의 이동을 하는 문제는 이동가능한 범위를 배열로 나타내어 문제를 풀면 쉽게 풀 수 있다. 최단 거리를 찾는 문제들은 bfs를 사용하면 문제를 해결할 수 있는 것 같다. #include int testCase; int length; int finalX, finalY; //최종 도착지 int mvCount; bool knightVisited[301][301] = {false}; int knightCount[301][301]; void printLocate(); void printVisited(); void knightBFS(int x,int y){ queue knightQ; knightQ.pus..

백준[1697] 숨바꼭질

기본적인 BFS문제만 풀다가 살짝 응용한 문제를 마주치니 정말 어렵게 느껴졌다.. 주의할 점) -1, +1, *2를 하고 탐색을 할 때 동생의 지점보다 넘어가서 뒤로 되돌아오는 경우가 더 시간이 짧게 걸리는 예제가 존재한다. □ 소스 코드 #include #define MAX 100001 #define MIN 0 bool disList[MAX] = {false}; int seekCnt = 0; int suN, broK; void hidebfs(){ queue disQ; disQ.push(make_pair(suN,0)); int subin = disQ.front().first; int time = disQ.front().second; disList[subin] = true; while(!disQ.empty..

백준[2178] 미로 탐색

bfs를 살짝 응용한 문제이다. bfs를 사용할 때 무언가 움직여서 확인하려면 행,열에 대해서 배열을 생성한 후 사용하면 쉽게 아이디어를 생각할 수 있다. □ 소스 코드 #include int mazeN,mazeM; int mazeList[100][100]{0}; void bfs2178(int x,int y){ queue mazeQ; int mvX[] = {-1,1,0,0}; int mvY[] = {0,0,-1,1}; mazeQ.push({x,y}); while (!mazeQ.empty()) { x = mazeQ.front().first; y = mazeQ.front().second; mazeQ.pop(); for(int i=0;i=mazeM ) continue; if(mazeList[dX][dY] ==..

백준[2667] 단지번호붙이기

dfs를 이용하면 쉽게 풀지만 저장하는 배열을 동적할당하면 메모리오류가 발생한다..; □ 소스 코드 #include int inputList[25][25]{0}; int aptCntList[25]{0};//단지 별 아파트 개수 int aptCnt; // 단지 개수 int apN; bool dfs2667(int x,int y){ if(x=apN) return false; if(inputList[x][y] == 1){ inputList[x][y] = 0; aptCntList[aptCnt]++; dfs2667(x+1, y); dfs2667(x-1, y); dfs2667(x, y+1); dfs2667(x, y-1); return true; } return false; } void countNumApartment..