Lv 2. 무인도 여행

2024. 8. 26. 21:12·Algorithm & Data Structures/Programers

 

코드 흐름

  • 100*100의 이차원배열을 0,0부터 최대 99,99까지 이차원 배열 순차적으로 돌면서
  • X표시라면 isVisited[][] = true로 설정하고
  • 아니라면 그값을 int[][] map에 옮겨 담는다.
  • BFS 탐색을 하면서 이어진 땅의 생존일수를 모두 더하고 
  • return하여 한 섬의 생존가능 일수를 구한후
  • 오름차순 정렬하여 풀이하였다.
import java.util.*;

class Solution {
    
    int[][] map;
    boolean[][] isVisited;
    int[][] d = {{-1,0},{0,-1},{1,0},{0,1}};
    
    class Node{
        int dx;
        int dy;
        public Node(int dx, int dy){
            this.dx = dx;
            this.dy = dy;
        }
    }
    
    public int[] solution(String[] maps) {
        ArrayList<Integer> answer = new ArrayList<>();
        int x = maps.length;
        int y = maps[0].length();
        
        // 모든 지도 활성화 (char -> int 변환 및 'X'를 0으로 처리)
        map = new int[x][y];
        isVisited = new boolean[x][y];
        for(int i = 0 ; i < x ; i++){
            for(int j = 0 ; j < y ; j++){
                char c = maps[i].charAt(j);
                if(c == 'X'){
                    map[i][j] = 0; // 'X'는 생존 불가능 지역이므로 0
                    isVisited[i][j] = true; // 'X'는 방문 처리
                } else {
                    map[i][j] = c - '0'; // 숫자는 그대로 int 변환
                }
            }
        }
        
        // 순차 체크 (isVisited[][] false 이면 BFS 호출)
        for(int i = 0 ; i < x ; i++){
            for(int j = 0 ; j < y ; j++){
                if(!isVisited[i][j] && map[i][j] != 0){ // 방문하지 않았고, 0이 아닌 곳만 BFS
                    answer.add(BFS(i, j));
                }
            }
        }
        
        if(answer.size() == 0)
            answer.add(-1);
        
        int[] r = answer.stream()
                .mapToInt(Integer::intValue)
                .toArray();
        Arrays.sort(r);
        return r;
    }
    
    // BFS 메서드 BFS로 현재 연결된 무인도의 총 생존 가능 일수 확보 및 isVisited 체크
    public int BFS(int i, int j){
        Queue<Node> q = new ArrayDeque<>();
        q.add(new Node(i, j));
        isVisited[i][j] = true;
        int sum = 0;
        
        while(!q.isEmpty()){
            Node n = q.poll();
            sum += map[n.dx][n.dy]; // 생존 일수 합산
            
            for(int k = 0 ; k < 4 ; k++){
                int nx = n.dx + d[k][0];
                int ny = n.dy + d[k][1];
                
                if(nx >= 0 && nx < map.length && ny >= 0 && ny < map[0].length && !isVisited[nx][ny] && map[nx][ny] != 0){
                    q.add(new Node(nx, ny));
                    isVisited[nx][ny] = true; // 큐에 넣을 때 방문 처리
                }
            }
        }
        return sum;
    }
}

'Algorithm & Data Structures > Programers' 카테고리의 다른 글

Lv 2. 미로탈출  (0) 2024.08.31
Lv 2. 괄호 변환  (0) 2024.08.28
Lv 2. 행렬 테두리 회전하기  (0) 2024.08.22
Lv 2. 배달  (0) 2024.08.20
Lv 2. 전력망을 둘로 나누기  (1) 2024.08.19
'Algorithm & Data Structures/Programers' 카테고리의 다른 글
  • Lv 2. 미로탈출
  • Lv 2. 괄호 변환
  • Lv 2. 행렬 테두리 회전하기
  • Lv 2. 배달
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (304) N
      • Algorithm & Data Structures (230) N
        • BOJ (89) N
        • SWEA (1)
        • Programers (136)
        • Data Structures (3)
      • DB (21) N
        • SQL (15) N
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    baekjoon
    전위순회
    동적계획법
    Dijkstra
    이진탐색
    위상정렬
    DynamicProgramming
    dp
    programmers
    PriorityQueue
    dfs
    경로압축
    투포인터
    알고리즘
    백트래킹
    binarySearch
    BFS
    유니온파인드
    구현
    algorithm
    Java
    unionfind
    Union-Find
    스택
    다익스트라
    이분탐색
    프로그래머스
    백준
    Stack
    후위순회
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
Lv 2. 무인도 여행
상단으로

티스토리툴바