알고리즘/깊이,너비함수(DFS,BFS)

아이템 줍기 프로그래머스(lv3)(bfs)

임혁진 2024. 2. 4. 06:31

import java.util.LinkedList;
import java.util.Queue;

class Solution {
	public int solution(int[][] rectangle, int characterX, int characterY, int itemX, int itemY) {
		int answer = 0;
		//최단거리니 bfs
		//겹치는 부분이 선따라 움직이지않고 건너뛸 수 있으니 2배늘리고,
		Boolean[][] graph = new Boolean[102][102];

		characterX *=2;
		characterY *=2;
		itemX *=2;
		itemY *=2;

		for(int i = 0 ; i < rectangle.length ; i++) {
			int[] doub = rectangle[i];
            for(int j = 0 ; j < doub.length ; j++){
                doub[j] *=2;
            }
			for(int j = doub[1] ; j<=doub[3] ; j++) {
				for(int k = doub[0] ; k<=doub[2] ;k++) {
					graph[j][k] = (j==doub[1] || j==doub[3] || k==doub[0] || k==doub[2])
							&& graph[j][k] != Boolean.FALSE;
				}
			}
		}
		Queue<Node> que = new LinkedList<>();
		que.add(new Node(characterY , characterX , 0));
		graph[characterY][characterX] = Boolean.FALSE;
		
		int[] divx = {0,0,-1,1};
		int[] divy = {-1,1,0,0};
		
		while(!que.isEmpty()) {
			Node node = que.poll();
			if(node.y == itemY && node.x == itemX) {
				answer = node.count;
				return answer/2;
			}
			
			for(int i = 0 ; i < 4 ; i++) {
				int newy = node.y + divy[i]; 
				int newx = node.x + divx[i];
				if(newy<0 || newx <0 || newy>102 || newx >102) continue;
				if(graph[newy][newx] != Boolean.TRUE) continue;
				que.add(new Node(newy, newx , node.count+1));
				graph[newy][newx] = Boolean.FALSE;
			}
		}
		return answer/2;
	}
}

class Node{
	int y;
	int x;
	int count;
	Node(int y , int x , int count) {
		this.y = y;
		this.x = x;
		this.count = count;
	}
}

 

어려웠던 점

  • 테두리를 따라 움직이는데, 입출력 예시 1 처럼 선을 건너뛰고, 공간을 이동하는경우
  • 테투리를 따라 움직일 수 있는 배열을 생성하는 것

이 두가지를 떠올리기가 어려운 문제였다.

- 크기를 두배 늘려서 맞닿는 값을 조절했다.

- boolean 이 아닌 Boolean객체를 사용하여

 두가지를 해결했다

 

새로이 안 점

이 문제를 통해 Boolean 객체와 boolean 데이터 타입의 차이를 알았고,

공간을 직접적으로 붙이기보다 간접적으로 이동하지 못하게 하는 꼼수(?) 같은 유연하게 생각하는 방법을 좀 더 고안해

봐야겠다.