일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Vue
- 수학
- 정보처리기사
- 자료 구조
- MYSQL
- 알고리즘
- Spring Security
- 그래프 이론
- 백준
- 프로그래머스
- 스택
- 재귀
- 소수 판정
- 다이나믹 프로그래밍
- DB
- 배포
- 문자열
- 너비 우선 탐색
- JPA
- 그래프 탐색
- 깊이 우선 탐색
- 정수론
- 백트래킹
- 프로젝트
- 구현
- SWEA
- n과 m
- 브루트포스 알고리즘
- dfs
- springboot
Archives
- Today
- Total
영원히 남는 기록, 재밌게 쓰자
백준 [16234] 인구 이동 (JAVA) 본문
728x90
반응형
문제
풀이
처음에 조건을 제대로 구현하지 못하여 틀렸습니다.를 많이 받았다.
구현 문제는 어떤 부분을 구현해야할 지 미리 적으면서 정리한 다음 시작하는 것이 좋은 것 같다.
- 인구 이동이 없을 때까지 반복한다.
- 모든 지점에 대해서 bfs 탐색을 진행한다.
- bfs 탐색을 진행했는데 인구 이동이 없으면 그 때까지의 카운트한 일 수를 출력한다.
- bfs탐색 시 맵의 범위 안에 있고, 인구 이동이 가능한 범위 (L이상 R이하)의 조건을 만족하면 인구 이동이 가능하다.
- 인구이동이 가능하면 리스트에 연합할 국가의 위치를 저장한다.
- bfs 탐색이 끝나면 연합 국가들의 인구이동 계산 결과를 반영한다.
정답 코드
package com.baekjoon.p16234;
import java.io.*;
import java.util.*;
public class Main {
static int N, L, R, day;
static int[][] map;
static boolean[][] v;
static LinkedList<int[]> unions;
static int[] dr = { 0, 1, 0, -1 };
static int[] dc = { 1, 0, -1, 0 };
static boolean isMove;
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];
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());
}
}
move();
System.out.println(day);
}
static void move() {
while (true) {
isMove = false;
v = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!v[i][j]) {
bfs(i, j);
}
}
}
if (!isMove) {
return;
} else {
day++; // 움직였다면 일 수를 카운트
}
}
}
// 연합이 가능한 국가들을 탐색
static void bfs(int r, int c) {
ArrayDeque<int[]> q = new ArrayDeque<>();
unions = new LinkedList<>();
v[r][c] = true;
q.add(new int[] { r, c });
unions.add(new int[] { r, c }); // 연합 국가들을 넣을 큐
while (!q.isEmpty()) {
int[] now = q.poll();
for (int i = 0; i < 4; i++) {
int nr = now[0] + dr[i];
int nc = now[1] + dc[i];
if (nr >= 0 && nc >= 0 && nr < N && nc < N && !v[nr][nc]
&& Math.abs(map[now[0]][now[1]] - map[nr][nc]) >= L
&& Math.abs(map[now[0]][now[1]] - map[nr][nc]) <= R) {
isMove = true;
v[nr][nc] = true;
q.add(new int[] { nr, nc });
unions.add(new int[] { nr, nc });
}
}
}
// bfs 탐색이 끝나고 인구이동 하기
if (unions.size() == 1) {
// 사이즈가 1이면 연합한 국가가 없음
return;
} else {
int size = unions.size();
int sum = 0;
for (int i = 0; i < size; i++) {
int[] pos = unions.get(i);
sum += map[pos[0]][pos[1]]; // 연합 국가 인구수를 모두 더해주기
}
// 인구이동 계산 결과를 연합국에 반영
int avg = sum / size;
for (int i = 0; i < size; i++) {
int[] pos = unions.poll();
map[pos[0]][pos[1]] = avg;
}
}
}
}
728x90
반응형
'Algorithm > 백준' 카테고리의 다른 글
백준 [1717] 집합의 표현 (JAVA) (0) | 2024.07.09 |
---|---|
백준 [3190] 뱀 (JAVA) (0) | 2024.07.08 |
백준 [1987] 알파벳 (JAVA) (0) | 2024.07.01 |
백준 [6064] 카잉 달력 (JAVA) (0) | 2024.06.28 |
백준 [6558] 골드바흐의 추측 (JAVA) (0) | 2024.06.26 |