[프로그래머스 Lev.2] 무인도 여행

정진수·2024년 4월 26일
0

[문제풀이]

(1) 그래프 탐색을 할 때 2차원 배열에 익숙했던 저는 1차원 String 배열을 2차원 char 배열로 변환하는 작업을 수행했습니다.
(2) 바다가 아니고('X'가 아닌 곳) 방문했던 적이 없는 좌표에서 깊이 우선 탐색(DFS)를 수행했습니다.
(3) 상하좌우 배열 dx, dy를 이용하여 배열의 범위를 벗어나지 않고 방문하지 않았던 곳의 식량 수를 더해나갔습니다.
(4) 더한 식량 수를 ArrayList 배열에 담고 int[] answer 배열에 넣어주고 오름차순 정렬하여 문제를 풀었습니다.

[코드]

import java.util.*;

class Solution {

    //방문 여부 판별하기 위한 배열
    static boolean[][] visited;
    
    //상, 하, 좌, 우 배열
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    
    static int cnt;
    static int[] answer;
    
    public int[] solution(String[] maps) {

        ArrayList<Integer> list = new ArrayList<>();
        visited = new boolean[maps.length][maps[0].length()];
        char[][] map = new char[maps.length][maps[0].length()];
        
        // 1차원 String 배열을 2차원 char 배열로 변환
        for(int i=0; i<maps.length; i++){
            for(int j=0; j<maps[i].length(); j++){
                map[i][j] = maps[i].charAt(j);
            }
        }
        
        
        for(int i=0; i<map.length; i++){
            for(int j=0; j<map[i].length; j++){ 
                if(map[i][j] != 'X' && !visited[i][j]) { // 바다가 아니고 방문하지 않은 곳 판별
                    cnt = 0;	//식량 수 초기화
                    dfs(i, j, map);
                    list.add(cnt);	//더한 식량 수 ArrayList 배열에 저장
                }
            }        
        }
        
        //지낼 수 있는 무인도가 없는 경우
        if(list.size() == 0){
            answer = new int[1];
            answer[0] = -1;
        }
        
        else {
            answer = new int[list.size()];
            for(int i=0; i<list.size(); i++){
                answer[i] = list.get(i);
            }
            
            //식량 수 오름차순 정렬
            Arrays.sort(answer);  
        }
       
        return answer;
    }
    static public void dfs(int r, int c, char[][] map){
        visited[r][c] = true;
        
        //식량 수 합하기
        cnt += (int)(map[r][c] - '0');
        
        for(int k=0; k<4; k++){
            int nx = r + dx[k];
            int ny = c + dy[k];
            
            if(nx >= 0 && ny >= 0 && nx < map.length && ny < map[0].length){
                if(map[nx][ny] != 'X' && !visited[nx][ny]) {
                    visited[nx][ny] = true;
                    dfs(nx, ny, map);
                }
            }
        }
    }
}

[막혔던 부분]

char 2차원 배열에 저장되어 있던 식량의 수를 더해줄 때 char를 int로 형 변환 해주는 과정에서 헷갈렸다. 숫자 형태의 char 값은 (int)(char값 - '0') 으로 해결했습니다.
※ 아스키 테이블을 따르는 유니코드 값으로 변환하는 경우 => Character.getNumericValue(char값);

profile
소통능력을 겸비한 자바 백엔드 개발자

0개의 댓글