코테/프로그래머스

[프로그래머스/Lv. 2] 무인도 여행 (JAVA)

imname1am 2024. 1. 13. 21:56
반응형

📖 문제

 

프로그래머스

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

programmers.co.kr

 

 

 

💡  풀이 방식

• BFS / DFS

1. 입력받은 1차원 String형 배열을 2차원 int형 배열 grid에 값을 저장한다.

  - 'X'를 입력받은 경우, -1로 값을 설정한다.

  - 숫자를 입력받은 경우, 숫자를 저장한다.

grid[i][j] = maps[i].charAt(j) - '0';

 

 

2. 완전탐색을 통해 2차원 배열 grid를 돌며 방문한 적 없고, X가 아닌 칸 (=-1이 아닌 칸)에 대해 탐색을 수행하며 머물 수 있는 날짜의 수를 구하고, 이 수들을 리스트에 저장한다.

 

3. 만약 머물 수 있는 날짜를 저장한 리스트의 크기가 0이라면, -1만 들어있는 배열을 출력한다.

그게 아닌 경우, 리스트의 값들을 오름차순 정렬한 후, 배열로 변환해 값을 출력하도록 한다.

 

 

 

🔺 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import java.util.*;
 
class Solution {
    static int[] dx = {-1100};    // 상하좌우 4방향 탐색용
    static int[] dy = {00-11};
    
    static int r, c;
    static int[][] grid;
    static boolean[][] visited;
 
    static List<Integer> list = new ArrayList<>();
    
    public int[] solution(String[] maps) {        
        r = maps.length;
        c = maps[0].length();      
        grid = new int[r][c];
        
        for(int i = 0 ; i < r ; i++) {
            for(int j = 0 ; j < c ; j++) {
                if(maps[i].charAt(j) == 'X') {
                    grid[i][j] = -1;
                }
                else {
                    grid[i][j] = maps[i].charAt(j) - '0';
                }
            }
        }
                
        visited = new boolean[r][c];
        
        for(int i = 0 ; i < r ; i++) {
            for(int j = 0 ; j < c ; j++) {
                if(!visited[i][j] && grid[i][j] != -1) {
                    bfs(i, j);
                }
            }
        }
        
        // 출력하기
        if(list.size() == 0) {
            return new int[]{-1};
        }
        
        Collections.sort(list); // 오름차순 정렬하기
        
        // 리스트를 배열로 변환,,
        int[] answer = new int[list.size()];
        int idx = 0;
        for(int i : list) {
            answer[idx++= i;
        }
        return answer;
    }
    
    private static void bfs(int x, int y) {
        visited[x][y] = true;
        
        Queue<int[]> q = new ArrayDeque<>();
        q.add(new int[] {x, y});
        
        int sum = grid[x][y];   // 연결된 땅들의 합
        
        while(!q.isEmpty()) {
            int[] now = q.poll();
            
            for(int d = 0 ; d < 4 ; d++) {  // 상하좌우 4방향 탐색
                int nx = now[0+ dx[d];
                int ny = now[1+ dy[d];
                
                if(canGo(nx, ny)) {
                    visited[nx][ny] = true;
                    sum += grid[nx][ny];    // 연결된 땅들의 합 갱신
                    q.add(new int[] {nx, ny});
                }
            }
        }
        
        list.add(sum);
    }
    
    // [방문 가능한 경우 판별 함수] 격자 범위 내에 있고, 방문한 적 없고, X가 아니면 방문 가능
    private static boolean canGo(int x, int y) {
        return (inRange(x, y) && !visited[x][y] && grid[x][y] != -1);
    }
    
    // 격자 범위 내에 있는지 판별용 함수
    private static boolean inRange(int x, int y) {
        return (0 <= x && x < r && 0 <= y && y < c);
    }
}
cs

 

 

➕ 다른 풀이 방식

DFS로도 풀이 가능하다.

 


💦 어려웠던 점

- 다들 1차원 배열 입력받은 거 그대로 활용하시는 분이 있나?했더니 다행히(?) 대부분 2차원 배열로 변환해 활용하셨다..

 

 

1회독 2회독 3회독 4회독 5회독
V        

 

반응형