티스토리 뷰

 

프로그래머스

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

programmers.co.kr

제한이 매우 널널해서 DFS로도 풀리는데 그냥 BFS가 더 간단해서 BFS로 풀었다.

구하고자 하는 것은 2차원 배열이 주어질때, 'P'의 거리가 2이하인 경우가 있는지 없는지이다. 따라서 'P'를 기준으로 탐색을 진행해서 거리 2 이내에 다른 'P'가 있는지 확인하면 된다. 주의해야 할것은 BFS를 돌릴때마다 방문 배열을 전부 밀어버려야 한다는 것이다. 

O(N^5)에 풀린다.

import java.util.*;

class Solution {
    private int[][] visited = new int[5][5];
    private int[] dx = {0, 0, -1, 1};
    private int[] dy = {-1, 1, 0, 0};
    private int flag = 1;
    private Queue<Node> q = new LinkedList<Node>();
    
    public int[] solution(String[][] places) {
        int[] answer = new int[5];
        for (int i=0; i<5; i++) {
            flag = 1;              
            for (int j=0; j<5; j++) {
                for (int k=0; k<5; k++) {
                    if (places[i][j].charAt(k) != 'P') continue;
                    for (int p=0; p<5; p++) for (int q=0; q<5; q++) visited[p][q] = -1;
                    
                    visited[j][k] = 0;
                    q.add(new Node(j, k));
                    bfs(places[i]);
                }
            }
            answer[i] = flag;
        }
        return answer;
    }
    
    private void bfs(String[] places) {
        while (q.size() != 0) {
            Node node = q.poll();
            for (int i=0; i<4; i++) {
                int nx = node.x + dx[i];
                int ny = node.y + dy[i];
                if (nx < 0 || ny < 0 || nx >= 5 || ny >= 5 || visited[nx][ny] != -1) continue;
                char ch = places[nx].charAt(ny);
                if (ch == 'X') continue;
                visited[nx][ny] = visited[node.x][node.y] + 1;
                if (ch == 'P' && visited[nx][ny] <= 2) {
                    flag = 0;
                }
                q.add(new Node(nx, ny));
            }
        }
    }
    
    private class Node {
        int x;
        int y;
        
        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}​
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함