Lv.3 아이템 줍기

https://school.programmers.co.kr/learn/courses/30/lessons/87694

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.Deque;
import java.util.LinkedList;

class Solution {
    private int[][] moves = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
    
    public int solution(int[][] rectangles, int characterX, int characterY, int itemX, int itemY) {
        int[][] map = new int[51 * 2][51 * 2];
        
        for (int[] rectangle : rectangles) {
            fillMap(map, rectangle);
        }
        
        int result = bfs(map, characterX, characterY, itemX, itemY);
        
        return result;
    }
    
    private void fillMap(int[][] map, int[] rectangle) {
        for (int row = rectangle[1] * 2; row <= rectangle[3] * 2; row++) {
            for (int col = rectangle[0] * 2; col <= rectangle[2] * 2; col++) {
                if (map[row][col] == -1) {
                    continue;
                }
                map[row][col] = isLine(rectangle, row, col) ? 1 : -1;
            }
        }
        
    }
    
    private boolean isLine(int[] rectangle, int row, int col) {
        return row == rectangle[1] * 2 || row == rectangle[3] * 2 
            || col == rectangle[0] * 2 || col == rectangle[2] * 2;
    }
    
    private int bfs(int[][] map, int characterX, int characterY, int itemX, int itemY) {
        int[] character = {characterY * 2, characterX * 2};
        int[] item = {itemY * 2, itemX * 2};
        Deque<int[]> queue = new LinkedList<>();
        
        map[character[0]][character[1]] = 0;
        queue.add(character);
        
        while (!queue.isEmpty()) {
            int[] currentCharacter = queue.removeFirst();
            int row = currentCharacter[0];
            int col = currentCharacter[1];
            int distance = map[row][col];
            if (row == item[0] && col == item[1]) {
                return distance / 2;
            }
            for (int[] move : moves) {
                int nextRow = row + move[0];
                int nextCol = col + move[1];
                if (!canMove(map, nextRow, nextCol)) {
                    continue;
                }
                map[nextRow][nextCol] = distance + 1;
                queue.add(new int[] {nextRow, nextCol});
            }
        }
        
        return 0;
    }
    
    private boolean canMove(int[][] map, int row, int col) {
        return 0 <= row && row < map.length
            && 0 <= col && col < map[row].length
            && map[row][col] == 1;
    }
}

'문제 풀이 > 프로그래머스' 카테고리의 다른 글

[PCCP 기출문제] 3번 / 충돌위험 찾기  (1) 2024.12.15
[PCCP 기출문제] 2번 / 퍼즐 게임 챌린지  (3) 2024.12.13
Lv.4 징검다리  (0) 2024.08.16
Lv.3 다단계 칫솔 판매  (0) 2024.08.03
Lv.3 부대복귀  (0) 2024.06.11
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유