[프로그래머스] 아이템 줍기 (JAVA)

유존돌돌이·2022년 1월 10일
0

Programmers

목록 보기
139/167
post-thumbnail

문제 설명

지형을 나타내는 직사각형이 담긴 2차원 배열 rectangle, 초기 캐릭터의 위치 characterX, characterY, 아이템의 위치 itemX, itemY가 solution 함수의 매개변수로 주어질 때, 캐릭터가 아이템을 줍기 위해 이동해야 하는 가장 짧은 거리를 return 하도록 solution 함수를 완성해주세요.

제한사항

rectangle의 세로(행) 길이는 1 이상 4 이하입니다.
rectangle의 원소는 각 직사각형의 [좌측 하단 x, 좌측 하단 y, 우측 상단 x, 우측 상단 y] 좌표 형태입니다.
직사각형을 나타내는 모든 좌표값은 1 이상 50 이하인 자연수입니다.
서로 다른 두 직사각형의 x축 좌표, 혹은 y축 좌표가 같은 경우는 없습니다.
문제에 주어진 조건에 맞는 직사각형만 입력으로 주어집니다.
charcterX, charcterY는 1 이상 50 이하인 자연수입니다.
지형을 나타내는 다각형 테두리 위의 한 점이 주어집니다.
itemX, itemY는 1 이상 50 이하인 자연수입니다.
지형을 나타내는 다각형 테두리 위의 한 점이 주어집니다.
캐릭터와 아이템의 처음 위치가 같은 경우는 없습니다.
전체 배점의 50%는 직사각형이 1개인 경우입니다.
전체 배점의 25%는 직사각형이 2개인 경우입니다.
전체 배점의 25%는 직사각형이 3개 또는 4개인 경우입니다.

Code

class Solution {
    private int ret;
	private int[][] dir;
	private boolean[][] map;
    public int solution(int[][] rectangle, int characterX, int characterY, int itemX, int itemY) {
        ret = Integer.MAX_VALUE;
		dir = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
		map = new boolean[102][102];
		
		for(int[] rect : rectangle) {
			int x1=rect[0]*2, y1=rect[1]*2, x2=rect[2]*2, y2=rect[3]*2;
			for(int i=x1 ; i<=x2 ; i++) {
				for(int j=y1 ; j<=y2 ; j++) {
					map[i][j] = true;
				}
			}
		}
		helper(characterX*2, characterY*2, itemX*2, itemY*2, new boolean[102][102], 0);
		return ret/2;
    }
    
    public void helper(int cx, int cy, int ix, int iy, boolean[][] visit, int cnt) {
		if(cx==ix && cy==iy) {
			ret = Math.min(ret, cnt);
			return;
		}
		if(ret<=cnt || !check(cx, cy, map, visit)) {
			return;
		}
		visit[cx][cy] = true;
		for(int[] d : dir) {
			helper(cx+d[0], cy+d[1], ix, iy, visit, cnt+1);
		}
		visit[cx][cy] = false;
	}
	
	public boolean check(int i, int j, boolean[][] map, boolean[][] visit) {
		if(visit[i][j] || !map[i][j]) return false;
		int[][] dir = new int[][]{{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}};
		for(int[] d : dir) {
			if(!map[i+d[0]][j+d[1]]) return true;
		}
		return false;
	}
}

Comment

최대 50까지이기 때문에 50으로 사이즈 잡고 하니 가생이인지 아닌지 체크하는 주위 boolean을 가져올때 가생이인데도 주위가 모두 true인 경우가 있다. 예제 1의 "ㄷ" 부분.
아... 이틀을 고민했다가 머리가 빠질것같아서 도움을 받았더니 사이즈를 2배로 늘려서하면 답이 나올거라는 힌트를 보고 무릎을 쳤다...

0개의 댓글