Study(진행중)/항해99
99클럽 코테 스터디 32일차 TIL / 아이템 줍기(프로그래머스)
Ski_
2024. 8. 22. 21:43
오늘의 학습 키워드
- 알고리즘
- 구현
- bfs
공부한 내용 본인의 언어로 정리하기
https://school.programmers.co.kr/learn/courses/30/lessons/87694
좌표를 2배로 늘리는 아이디어를 떠올리는게 까다로웠던 bfs 문제를 풀었다.
아이디어만 떠올리면 이후에는 풀만했던 것 같다.
풀이 과정은 다음과 같다.
1. 좌표를 2배로 늘림
2. 사각형의 범위를 모두 1로 채움
3. 사각형의 내부를 모두 0으로 바꿈
4. bfs를 통해 1인 경로로만 최단 경로 탐색(1인 경로 = 문제 조건에서의 경로)
풀이는 다음과 같다.
import java.util.*;
class Solution {
public int solution(int[][] rectangles, int characterX, int characterY, int itemX, int itemY) {
int[][] map = new int[104][104];
for (int[] rectangle : rectangles) {
for (int y = rectangle[1] * 2; y <= rectangle[3] * 2; y++) {
for (int x = rectangle[0] * 2; x <= rectangle[2] * 2; x++) {
map[y][x] = 1;
}
}
}
for (int[] rectangle : rectangles) {
for (int y = rectangle[1] * 2 + 1; y < rectangle[3] * 2; y++) {
for (int x = rectangle[0] * 2 + 1; x < rectangle[2] * 2; x++) {
map[y][x] = 0;
}
}
}
int[] dy = {0, 1, 0, -1};
int[] dx = {1, 0, -1, 0};
Queue<int[]> que = new ArrayDeque<>();
que.add(new int[] {characterY * 2, characterX * 2, 0});
boolean[][] visit = new boolean[104][104];
visit[characterY * 2][characterX * 2] = true;
while(!que.isEmpty()) {
int[] cur = que.poll();
if (cur[0] == itemY * 2 && cur[1] == itemX * 2) {
return cur[2] / 2;
}
for (int i = 0; i < 4; i++) {
int ny = cur[0] + dy[i];
int nx = cur[1] + dx[i];
if (ny < 0 || nx < 0 || ny >= 104 || nx >= 104) continue;
if (visit[ny][nx] || map[ny][nx] != 1) continue;
visit[ny][nx] = true;
que.add(new int[] {ny, nx, cur[2] + 1});
}
}
return -1;
}
}
반응형