Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- baekjoon
- springboot
- dfs
- 백준 현수막
- beakjoon
- beakjoon 1697
- 안전영역 java
- bytebuddyinterceptor
- baekjoon 14714
- baekjoon 2468
- 단지 번호붙이기
- baekjoon1012
- java.lang.nosuchmethoderror
- 양치기 꿍
- 점프왕 쩰리
- 백준 2667 java
- backjoon 16173
- 백준 섬의갯수
- beakjoon11725
- CodingTest
- baekjoon 4963
- baekjoon 16953
- BFS
- coding test
- 코테스터디
- jsonignore
- 코테
- websecurityconfiguration
- baekjoon 2667
- baekjoon 3187
Archives
- Today
- Total
NOT FOUND
[코테] 백준 4963 섬의 갯수: DFS Java 본문
백준은 입력 받는게 너무 부담스럽다....
https://www.acmicpc.net/problem/4963
1) 입력 부분
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class baekjoon_4963 {
static int count; // 섬의 갯수
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int w = Integer.parseInt(st.nextToken()); // 지도의 너비
int h = Integer.parseInt(st.nextToken()); // 지도의 높이
while (w != 0 && h != 0) {
int[][] map = new int[w][h];
for (int i = 0; i < h; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < w; j++) {
map[j][i] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine(), " ");
w = Integer.parseInt(st.nextToken());
h = Integer.parseInt(st.nextToken());
}
br.close();
}
}
0 0이 입력되면 테스트 케이스 종료.
첫번째 줄은 지도 가로와 세로 길이, 두번째 줄부터는 지도가 입력됨.
2) dfs 함수 로직
public static void dfs(int x, int y, int[][] map) {
visited[y][x] = true;
for (int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && ny < map.length && nx < map[0].length) {
if (!visited[ny][nx] && map[ny][nx] == 1) {
dfs(nx, ny, map);
}
}
}
}
기본적으로 전에 풀었던 dfs 문제들과 동일하다.
그런데 이번엔 '대각선'도 포함이므로 8방향을 사용한다.
dfs에 들어가면 해당 좌표는 방문 처리를 한다.
그리고 8방향을 돌면서, 인접하는 섬에 방문을 한다.
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class baekjoon_4963 {
static boolean[][] visited;
static int[] dx = { 0, -1, 0, 1, -1, -1, 1, 1 }; // 8방향
static int[] dy = { 1, 0, -1, 0, -1, 1, -1, 1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int w = Integer.parseInt(st.nextToken()); // 지도의 너비
int h = Integer.parseInt(st.nextToken()); // 지도의 높이
if (w == 0 && h == 0) break;
int[][] map = new int[h][w];
visited = new boolean[h][w];
for (int i = 0; i < h; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < w; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int count = 0;
for (int y = 0; y < h; y++) { // 세로 길이만큼
for (int x = 0; x < w; x++) { // 가로 길이만큼
if (map[y][x] == 1 && !visited[y][x]) { // 방문 안 한 섬이라면
dfs(x, y, map);
count++;
}
}
}
System.out.println(count);
}
br.close();
}
public static void dfs(int x, int y, int[][] map) {
visited[y][x] = true;
for (int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && ny < map.length && nx < map[0].length) {
if (!visited[ny][nx] && map[ny][nx] == 1) {
dfs(nx, ny, map);
}
}
}
}
}
'coding test' 카테고리의 다른 글
[코테] 백준 2667 단지 번호붙이기: DFS Java (1) | 2025.05.07 |
---|---|
[코테] 백준 3187 양치기 꿍: DFS Java (0) | 2025.05.06 |
[코테] 백준 1012 유기농 배추: DFS Java (1) | 2025.05.04 |
[코테] 백준 2606 바이러스: DFS Java (1) | 2025.05.03 |
[코테] 프로그래머스 불량 사용자 64064: DFS JAVA (1) | 2025.05.02 |