peacekim
할 수 있는 것과 할 수 없는 것.
peacekim
전체 방문자
오늘
어제
  • 분류 전체보기 (68)
    • 👨‍🏫ps (44)
      • ❄️프로그래머스 (20)
      • 🔟0️⃣백준 (21)
      • leetcode (3)
    • ✍🏻study (20)
      • 👐java (6)
      • 🍃spring (1)
      • 🥇algorithm (0)
      • 🚘oodp (4)
      • 📒 jpa (3)
      • 👣DB (2)
      • 🌂네트워크 (0)
      • 🎸기타 (3)
      • 👊 kotlin (1)
      • 🫥 jvm (0)
    • 📽project (4)
      • 🎀ReBoN (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
peacekim

할 수 있는 것과 할 수 없는 것.

[백준] 16234번 인구 이동 풀어보기 [Java]
👨‍🏫ps/🔟0️⃣백준

[백준] 16234번 인구 이동 풀어보기 [Java]

2022. 3. 18. 01:26
반응형

구현과 BFS문제이다. 두 문제 연속으로 한번에 맞춰서 기분이 좋다. 하지만, 효율성이 극악인거 같다,,,,좀 더 효율이 어떻게 좋게 만들지 고민을 해야겠다!!

 

👨‍🏫 풀이

어느 나라가 국경을 서로 여는지 알기 위해서, BFS로 현재 연 국경에 대해서 모두 구했다. 그래서 국경을 연 나라끼리는 동일한 숫자를 저장해줬다.

서로 국경을 연 나라를 조각으로 봤다.

그리고 조각에는 국경을 연 나라들의 인구수 합과 나라 갯수를 저장했다.

조각들의 갯수가 N*N이라면, 모든 나라가 국경을 연 것이 아니기 때문에 시뮬레이션을 끝냈고, 그렇지 않다면, 저장한 조각들의 나라들에게 인구수의 합 / 나라 갯수를 해줘서 저장을 해줬다.

조각들의 갯수가 N*N이 될때까지 계속 해주었다.

 

👨🏻‍💻 코드

package 번16234;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static class Node{
        int x,y;
        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    static class Country{
        int cnt;
        int sum;
        int num;

        public Country(int cnt, int sum, int num) {
            this.cnt = cnt;
            this.sum = sum;
            this.num = num;
        }
    }
    static int N,L,R;
    static int[][] map;
    static int[][] tmp;
    static int[] mX = {0,0,1,-1};
    static int[] mY = {1,-1,0,0};
    static Queue<Country> moveCountry = new LinkedList<Country>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        L = Integer.parseInt(st.nextToken());
        R = Integer.parseInt(st.nextToken());

        map = new int[N][N];
        tmp = new int[N][N];
        for(int i = 0 ; i < N ; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0 ; j < N ; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        int ans = 0;
        while(true) {
            int cnt = 1;

            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if (tmp[i][j] == 0) {
                        bfs(cnt, i, j);
                        cnt++;
                    }
                }
            }
            if(cnt == N*N + 1) break;
            move();
            ans++;
        }

        System.out.println(ans);
    }

    private static void move() {
        while(!moveCountry.isEmpty()) {
            Country cur = moveCountry.poll();
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if(tmp[i][j] == cur.num) {
                        map[i][j] = cur.sum / cur.cnt;
                        tmp[i][j] = 0;
                    }
                }
            }
        }
    }

    private static void bfs(int num, int i, int j) {
        Queue<Node> q = new LinkedList<>();
        tmp[i][j] = num;
        int sum = 0;
        int cnt = 0;
        q.add(new Node(i,j));
        while(!q.isEmpty()){
            Node cur = q.poll();
            sum += map[cur.x][cur.y];
            cnt++;
            for(int k = 0 ; k < 4 ; k++){
                int nX = cur.x + mX[k] ; int nY = cur.y + mY[k];
                if(nX < 0 || nX >= N || nY < 0 || nY >= N) continue;
                if(tmp[nX][nY] != 0) continue;
                int diff = Math.abs(map[cur.x][cur.y] - map[nX][nY]);
                if( diff >= L && diff <= R){
                    tmp[nX][nY] = num;
                    q.add(new Node(nX,nY));
                }

            }
        }
        moveCountry.add(new Country(cnt,sum,num));
    }
}
반응형

'👨‍🏫ps > 🔟0️⃣백준' 카테고리의 다른 글

[백준] 2629번 양팔저울 풀어보기 [Java]  (0) 2022.03.19
[백준] 1405번 미친 로봇 풀어보기 [Java]  (0) 2022.03.19
[백준] 16926번 배열 돌리기 1 풀어보기 [Java]  (0) 2022.03.18
[백준] 2174번 로봇 시뮬레이션 풀어보기 [Java]  (0) 2022.03.16
[백준] 20058번 마법사 상어와 파이어스톰 풀어보기 [Java]  (0) 2022.03.11
    '👨‍🏫ps/🔟0️⃣백준' 카테고리의 다른 글
    • [백준] 2629번 양팔저울 풀어보기 [Java]
    • [백준] 1405번 미친 로봇 풀어보기 [Java]
    • [백준] 16926번 배열 돌리기 1 풀어보기 [Java]
    • [백준] 2174번 로봇 시뮬레이션 풀어보기 [Java]
    peacekim
    peacekim
    할 수 있는 것과 할 수 없는 것. github: https://github.com/PyeongGangKim

    티스토리툴바