개발새발 로그

[JS] 백준 16234번 : 인구이동 본문

알고리즘

[JS] 백준 16234번 : 인구이동

이즈흐 2023. 7. 3. 14:00

https://www.acmicpc.net/problem/16234

 

16234번: 인구 이동

N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모

www.acmicpc.net

 

📋풀이방법

1. 상하좌우 검사 L명이상 R명이하인지

2. DFS를 통해 연합배열에 삽입, visited활성화로 중복 탐색 방지

3. 연합배열안에 든 좌표끼리 연합공식으로 인구수를 나눠서 넣음

4. 다시 처음([0,0]) 나라부터 검사 -인구수가 바뀌었으니까

 

 

🤟내 제출

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim();
input=input.replace(/\r/g,"").split("\n");

let t_arr=input.shift().split(" ").map(Number);
let N=t_arr[0];
let L=t_arr[1];
let R=t_arr[2];

let arr=[];
for(var i=0;i<N;i++){
    arr.push(input.shift().split(" ").map(Number));
}


let dx=[1,0,0,-1];
let dy=[0,1,-1,0];
let answer=0;
while(1){
    let visited =Array.from({length:N},()=>Array(N).fill(0))
    let Union=[];
    for(var i=0;i<N;i++){
        for(var j=0;j<N;j++){
            if(visited[i][j]==0){
                let temp=[];
                function DFS(D,y,x){
                    for(var z=0;z<4;z++){
                        let nx=x+dx[z];
                        let ny=y+dy[z];
                        if(nx>=0&&ny>=0&&nx<N&&ny<N &&visited[ny][nx]==0){
                            let num=Math.abs(arr[ny][nx]-arr[y][x]);
                            if(num>=L && num<=R){
                                visited[ny][nx]=1;
                                temp.push([ny,nx,arr[ny][nx]])
                                DFS(L+1,ny,nx)
                            }
                            
                        }
                    }
                }
                visited[i][j]=1;
                temp.push([i,j,arr[i][j]])
                DFS(0,i,j);
                if(temp.length>1) Union.push(temp);
            }
            
        }
    }
    if(Union.length==0) break;
    Union.forEach((area)=>{
        let sum=area.reduce((a,c)=>a+c[2],0)
        area.forEach((t_area)=>{
            let [ay,ax,peo]=t_area;
            let go=Math.floor(sum/area.length);
            arr[ay][ax]=go
        });
        
    })
    answer++;
}
console.log(answer)

 

 

📝추가적인 부분

1. 한번에 문제를 맞췄다.

2. 푸는 시간은 약 50분 걸렸다.

3.어려웠던 부분이 없었다.

 

728x90
반응형
LIST

'알고리즘' 카테고리의 다른 글

[JS] 백준 12100 : 2048(Easy)  (0) 2023.07.05
[JS] 백준 13460번 : 구술 탈출 2  (0) 2023.07.04
[JS] 백준 14499번 : 주사위 굴리기  (0) 2023.07.02
[JS] 백준 16236 : 아기상어  (0) 2023.07.01
[JS] 백준 3190번 : 뱀  (0) 2023.06.30