Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 완전탐색
- 노마드코더
- ReactNative
- springboot
- 경우의 수
- 창의충전소
- 버튼 활성화
- 오블완
- 백준 1992
- Project Bee
- react
- 비트마스킹
- 휴대폰 기기
- multipart upload
- service 테스트
- 상속 관계 매핑
- 이영직
- React Native
- FlatList
- 티스토리챌린지
- 구현
- web view
- 원복
- 폴더구조
- 자료구조
- 해외 대외활동
- Navigation
- BFS
- React Natvive
- bfs dfs
Archives
- Today
- Total
유미의 기록들
[백준 3주차 - 16234] 인구이동 (Java) 본문
728x90
반응형
📌 문제
📝풀이과정
인구이동이 없을 때까지 모든 좌표를 DFS로 탐색하면서 while문으로 반복하였고, 인구인동이 없으면 break문으로 종료하도록 코드를 구현하였다
- 두 나라의 인구 차이 L이상 R이하 일 때 탐색한다
- ArrayList를 사용하여 방문한 좌표값을 저장한다
- DFS 탐색이 끝난 후, (ArrayList의 합)/ (ArrayList의 사이즈) 를 각 칸의 인구수로 만든다
- 인구 이동이 없으면 break문으로 종료함
while(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
dfs(i,j) //간격이 l이상 r이하이면 탐색
}
}
...
if(flag==false) break; //인구이동 발생 안하면 끝
}
💻코드
import java.util.Scanner;
import java.io.*;
import java.util.*;
public class Main{
static int n,l,r;
static int map[][];
static int visited[][];
static int dy[]={-1,0,1,0};
static int dx[]={0,1,0,-1};
static int sum=0;
static ArrayList<Pair> list=new ArrayList<>();
public static class Pair{
int y,x;
Pair(int y,int x){
this.y=y;
this.x=x;
}
}
public static void dfs(int y,int x){
for(int i=0;i<4;i++){
int ny=y+dy[i];
int nx=x+dx[i];
if(ny<0 || ny>=n || nx<0 || nx>=n) continue;
if(visited[ny][nx]==0 && Math.abs(map[y][x] - map[ny][nx])>=l && Math.abs(map[y][x]- map[ny][nx])<=r ){
visited[ny][nx]=1;
list.add(new Pair(ny,nx));
sum+=map[ny][nx];
dfs(ny,nx);
}
}
}
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
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];
visited=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 cnt=0;
while(true){
boolean flag=false;
//초기화
for(int i=0;i<n;i++){
Arrays.fill(visited[i],0);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(visited[i][j]==0){
list.clear();
visited[i][j]=1;
list.add(new Pair(i,j));
sum=map[i][j];
dfs(i,j);
if(list.size()==1) continue;
for(Pair p :list){
map[p.y][p.x]=sum/list.size();
flag=true;
}
}
}
}
if(flag==false) break;
cnt++;
}
System.out.println(cnt);
}
}
728x90
반응형
'코딩테스트 기록 > 알고리즘 문제' 카테고리의 다른 글
[백준 3주차 - 12869] 뮤탈리스크 (Java) (0) | 2024.04.08 |
---|---|
[백준 2주차 - 2178] 미로탐색 (Java) (1) | 2024.04.04 |
[백준 2주차 - 1992] 쿼드트리 (Java) (0) | 2024.02.24 |
[백준 1주차 - 4375] 1 (Java) (0) | 2024.02.19 |
[백준 1주차 - 1629] 곱셈 (Java) (0) | 2024.02.18 |
Comments