๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Java] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ปฌ๋Ÿฌ๋ง๋ถ & ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ•ฉ์Šนํƒ์‹œ์š”๊ธˆ ๋ณธ๋ฌธ

๐—ฃ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ถ๐—ป๐—ด๐Ÿ’ป/๐‰๐š๐ฏ๐š

[Java] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ปฌ๋Ÿฌ๋ง๋ถ & ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ•ฉ์Šนํƒ์‹œ์š”๊ธˆ

๐ŸคRyusun๐Ÿค 2024. 4. 11. 15:45

๋งค์ผ ์ฝ”ํ…Œ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์žˆ์ง€๋งŒ ๋ธ”๋กœ๊ทธ์—๋Š” ์˜ค๋žœ๋งŒ์— ์ฝ”ํ…Œ ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ ค๋ณธ๋‹ค.

 

1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ปฌ๋Ÿฌ๋ง๋ถ(Lv.2)

 

๋‹จ์ˆœ BFS ๋ฌธ์ œ์ด๋‹ค. ์ผ๋ฐ˜ BFS๋ฐฉ์‹์œผ๋กœ ํ’€๋ฉด ์‰ฝ๊ฒŒ ํ’€๋ฆฌ๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋‹ค๋ฅธ ์ƒ‰์ด๋ฉด cnt++ ํ•˜๊ณ  bfs๋กœ ํ•ด๋‹น ์ƒ‰์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ max_cnt๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ๋‹ค.

import java.util.*;
class Solution {
    static boolean[][] visited;
    static int[] dx = {1, 0, -1, 0};
    static int[] dy = {0, -1, 0, 1};
    static int max_cnt;
    public int[] solution(int m, int n, int[][] picture) {
        visited = new boolean[m][n];
        int cnt = 0;
        max_cnt = 0;
        for (int i =0 ; i < m; i++){
            for (int j = 0; j < n; j++){
                if (picture[i][j] != 0){
                    bfs(i, j, m, n, picture);
                    cnt++;
                }
            }
        }
        int[] answer = {cnt, max_cnt};
        return answer;
    }
    
    private static void bfs(int a, int b, int m, int n, int[][] picture){
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[] {a,b});
        visited[a][b] = true;
        int num = picture[a][b];
        int num_cnt = 1;
        picture[a][b] = 0;
        
        while (!queue.isEmpty()){
            int[] now = queue.poll();
            int x = now[0];
            int y = now[1];
            for (int i = 0; i< 4; i++){
                int nx = dx[i] + x;
                int ny = dy[i] + y;
                if (nx < 0 || ny < 0 || nx > m-1 || ny > n-1) continue;
                if (visited[nx][ny]) continue;
                if (picture[nx][ny] == 0 || picture[nx][ny] != num) continue;
                visited[nx][ny] = true;
                picture[nx][ny] = 0; //๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด picture์—์„œ ํ•ด๋‹น ์นธ์„ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ
                queue.offer(new int[] {nx,ny});
                num_cnt++;
                
            }
        }
        max_cnt = Math.max(max_cnt, num_cnt); // ๋‹ค ๋Œ์•˜์œผ๋ฉด max_cnt๊ฐ’ ๊ฐฑ์‹ 
        
    }
}

 

 

 

2. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ•ฉ์Šนํƒ์‹œ์š”๊ธˆ(Lv.3)

 

๋‹ค์ต์ŠคํŠธ๋ผ ๋ฌธ์ œ์ด๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ฐฑ์ค€ 1504 ํŠน์ •ํ•œ ์ตœ๋‹จ๊ฒฝ๋กœ์˜ ๋ฌธ์ œ์™€ ๋น„์Šทํ•˜๋‹ค.

ํ•„์ž๋„ 1504๋ฌธ์ œํ’€์ด์™€ ๋น„์Šทํ•˜๊ฒŒ ํ’€์—ˆ๋”๋‹ˆ ํ’€์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋…ธ๋“œ๋Š” ์–‘๋ฐฉํ–ฅ์ด๊ธฐ๋•Œ๋ฌธ์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋„ a -> i  = i ->a ๊ฐ€ ๋˜‘๊ฐ™๋‹ค. 

๋”ฐ๋ผ์„œ s์—์„œ ์ถœ๋ฐœํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ , a์—์„œ ์ถœ๋ฐœํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ, b์—์„œ ์ถœ๋ฐœํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์ฃผ๊ณ ์„œ,

(s์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๊ฐ i๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ) + (i๋ฒˆ ๋…ธ๋“œ์—์„œ a๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ) + (i๋ฒˆ ๋…ธ๋“œ์—์„œ b๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ) ์˜ ์ตœ์†Œํ•ฉ์„ ๊ตฌํ•ด์คฌ๋‹ค.

import java.util.*;

class Solution {
    static ArrayList<Node>[] graph;
    
    public int solution(int n, int s, int a, int b, int[][] fares) {
        graph = new ArrayList[n+1];
        for (int i = 1; i <= n; i++) {
            graph[i] = new ArrayList<>();
        }
        
        for (int[] fare : fares) {
            int start = fare[0];
            int end = fare[1];
            int cost = fare[2];
            graph[start].add(new Node(end, cost));
            graph[end].add(new Node(start, cost));
        }
        
        int[] S = dijkstra(s, n); // s์—์„œ ์ถœ๋ฐœ
        int[] A = dijkstra(a, n); // a์—์„œ ์ถœ๋ฐœ
        int[] B = dijkstra(b, n); // b์—์„œ ์ถœ๋ฐœ

        int min = Integer.MAX_VALUE;

        for(int i=1; i<=n; i++) {
        // (s์—์„œ i๋…ธ๋“œ๊นŒ์ง€ ๊ฑฐ๋ฆฌ) + (i๋…ธ๋“œ์—์„œ a๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ) + (i๋…ธ๋“œ์—์„œ b๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ) ์˜ ์ตœ์†Œ๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.
            if(min > S[i] + A[i] + B[i]) { 
                min = S[i] + A[i] + B[i];
            }
        }

        return min;
    }
    
    public static int[] dijkstra(int start, int n) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        boolean[] visited = new boolean[n+1];
        int[] dist = new int[n+1];
        Arrays.fill(dist, Integer.MAX_VALUE); // ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
        dist[start] = 0;
        pq.add(new Node(start, 0));
        
        while (!pq.isEmpty()) {
            Node now = pq.poll();
            int idx = now.index;
            
            if (visited[idx]) continue;
            visited[idx] = true;
            
            for (Node next : graph[idx]) {
                int cost = dist[idx] + next.cost;
                if (dist[next.index] > cost) {
                    dist[next.index] = cost;
                    pq.offer(new Node(next.index, cost));
                }
            }
        }
        
        return dist;
    }
    
    public static class Node implements Comparable<Node> {
        int index;
        int cost;
        
        public Node(int index, int cost){
            this.index = index;
            this.cost = cost;
        }
        
        @Override
        public int compareTo(Node o){
            return Integer.compare(this.cost, o.cost);
        }
    }
}

 

 

 

๊ถ๊ธˆํ•œ์ ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋‹ฌ์•„์ฃผ์„ธ์šฉ^_^