문제
https://school.programmers.co.kr/learn/courses/30/lessons/87694
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2차원 배열에서 주어진 rectangle을 바탕으로 테두리 부분만 그리고 해당 경로를 바탕으로 bfs를 활용하여 해결하는 문제
한 가지 주의할 점은 단순히 주어진 정보를 그대로 2차원배열화 하면 아래와 같은 문제가 발생할 수 있음
이런 문제는 90도 회전해서 접근하면 이해하기 쉽다
빨간색으로 표시한 부분 때문에 bfs를 진행할시 예상과 다른 결과값이 나올 수 있다
이를 해결하기위해 주어진 모든 정보를 2배 한다음 문제를 해결하고 결과를 2로 나누어주면 쉽게 해결할 수 있다
import java.util.*;
class Solution {
static int[][] map = new int[101][101];
static boolean[][] v = new boolean[101][101];
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, -1, 0, 1};
public int solution(int[][] rectangle, int characterX, int characterY, int itemX, int itemY) {
int answer = 0;
characterX *= 2;
characterY *= 2;
itemX *= 2;
itemY *= 2;
for(int[] arr : rectangle) {
for(int i=0; i<arr.length; i++) arr[i] *= 2;
makeMap(arr);
}
answer = bfs(new Node(characterX, characterY, 0), new Node(itemX, itemY, 0));
return answer/2;
}
static int bfs(Node start, Node end) {
Queue<Node> q = new LinkedList<>();
q.add(start);
while(!q.isEmpty()) {
Node cur = q.poll();
v[cur.r][cur.c] = true;
if(cur.r == end.r && cur.c == end.c) {
return cur.cnt;
}
for(int i=0; i<4; i++) {
int nr = dr[i] + cur.r;
int nc = dc[i] + cur.c;
if(nr<0 || nc<0 || nr>=101 || nc>=101 || v[nr][nc] || map[nr][nc]!=2) continue;
q.add(new Node(nr, nc, cur.cnt+1));
v[nr][nc] = true;
}
}
return 0;
}
static void makeMap(int[] arr) {
for(int i=arr[0]; i<=arr[2]; i++) {
for(int j=arr[1]; j<=arr[3]; j++) {
if(map[i][j] == 1) continue;
if(i==arr[0] || i==arr[2] || j==arr[1] || j==arr[3]) {
map[i][j] = 2;
} else {
map[i][j] = 1;
}
}
}
}
static class Node {
int r, c, cnt;
public Node(int r, int c, int cnt) {
this.r = r;
this.c = c;
this.cnt = cnt;
}
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 보행자 천국 - Java (2) | 2024.09.01 |
---|---|
[프로그래머스] 풍선 터트리기 - Java (0) | 2024.09.01 |
[프로그래머스] 코딩 테스트 공부 - Java (0) | 2024.08.31 |
[프로그래머스] 선입 선출 스케줄링 - Java (0) | 2024.08.30 |
[프로그래머스] 표 편집 - Java (0) | 2024.08.29 |