오늘의 학습 키워드
</> 깊이/너비 우선 탐색(DFS/BFS)
공부한 내용 본인의 언어로 정리하기
import java.io.*;
import java.util.*;
public class Main {
// 방향을 나타내는 이차원 배열
private static final int[][] DIRECTIONS = {
{-1, 0}, // 상
{1, 0}, // 하
{0, -1}, // 좌
{0, 1}, // 우
{-1, -1}, // 좌상
{-1, 1}, // 우상
{1, -1}, // 좌하
{1, 1} // 우하
};
//DFS 탐색
//주어진 셀에서 시작해서 값이 0이 아닌 셀들을 탐색
private static void bfs(int[][] map, int x, int y){
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{x, y});
map[x][y] = 0; // 방문 처리: 나쁜 풀을 0으로 설정
while(!queue.isEmpty()){
int[] current = queue.poll();
int cx = current[0];
int cy = current[1];
for(int[] dir : DIRECTIONS){
int nx = cx + dir[0];
int ny = cy + dir[1];
//유효성 검사: 범위 체크 및 값 확인
if(nx >= 0 && nx < map.length && ny >= 0 && ny < map[0].length && map[nx][ny] != 0){
//유효한 셀을 큐에 추가
queue.add(new int[]{nx,ny});
//방문 처리
map[nx][ny] = 0;
}
}
}
}
//섬의 개수 세기
private static int countIslands(int[][] map){
int R = map.length;
int C = map[0].length;
int count = 0;
//모든 셀을 순회하며 0이 아닌 값을 찾음
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
if(map[i][j] != 0){
bfs(map, i ,j);
count++;
}
}
}
return count;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 번째 줄에서 행과 열의 크기를 읽음
String[] firstLine = br.readLine().split(" ");
int R = Integer.parseInt(firstLine[0]);
int C = Integer.parseInt(firstLine[1]);
int[][]map = new int[R][C];
for (int i = 0; i < R; i++) {
// 각 행의 데이터를 읽어 배열에 저장
String[] row = br.readLine().split(" ");
for (int j = 0; j < C; j++) {
map[i][j] = Integer.parseInt(row[j]);
}
}
br.close();
int result = countIslands(map); // 섬의 개수를 계산
System.out.println(result);
}
}
오늘의 회고
문제를 보니 실버2 문제였다...이게 과연 비기너의 수준에 맞는걸까...주변 사람들에게 물어보니 직접 푼 사람이 없었던 것 처럼 보인다.
오늘도 문제는 겨우 10분만에 이해했지만 어떻게 진행을 해야할지 감도 안잡혀서 GPT의 도움을 받아 문제 풀이의 과정을 이해하려고 노력하는 것을 목표로 진행했다.
하지만 전 방향을 순회해서 확인하는것과 큐값을 순차적으로 뽑아서 체크를 하고 방문처리를 한다는것 이외에는 너무 어려워서 이해가 힘들다...
실버2 문제 풀려면 아직 정말 많은 문제를 경험해야 할 것 같다..
AI 코드리뷰
현재 코드의 장점
현재 코드의 단점
시간 복잡도
import java.io.*;
import java.util.*;
public class Main {
// 방향을 나타내는 이차원 배열
private static final int[][] DIRECTIONS = {
{-1, 0}, // 상
{1, 0}, // 하
{0, -1}, // 좌
{0, 1}, // 우
{-1, -1}, // 좌상
{-1, 1}, // 우상
{1, -1}, // 좌하
{1, 1} // 우하
};
// DFS 탐색
private static void dfs(int[][] map, boolean[][] visited, int x, int y) {
Stack<int[]> stack = new Stack<>();
stack.push(new int[]{x, y});
visited[x][y] = true;
while (!stack.isEmpty()) {
int[] current = stack.pop();
int cx = current[0];
int cy = current[1];
for (int[] dir : DIRECTIONS) {
int nx = cx + dir[0];
int ny = cy + dir[1];
if (nx >= 0 && nx < map.length && ny >= 0 && ny < map[0].length && map[nx][ny] != 0 && !visited[nx][ny]) {
stack.push(new int[]{nx, ny});
visited[nx][ny] = true;
}
}
}
}
// 섬의 개수 세기
private static int countIslands(int[][] map) {
int R = map.length;
int C = map[0].length;
int count = 0;
boolean[][] visited = new boolean[R][C];
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[i][j] != 0 && !visited[i][j]) {
dfs(map, visited, i, j);
count++;
}
}
}
return count;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] firstLine = br.readLine().split(" ");
int R = Integer.parseInt(firstLine[0]);
int C = Integer.parseInt(firstLine[1]);
int[][] map = new int[R][C];
for (int i = 0; i < R; i++) {
String[] row = br.readLine().split(" ");
for (int j = 0; j < C; j++) {
map[i][j] = Integer.parseInt(row[j]);
}
}
br.close();
int result = countIslands(map);
System.out.println(result);
}
}
개선된 버전의 장점
개선된 버전의 단점
시간 복잡도
내일 공부할 것 :
DFS와 BFS에 대해서 개념과 동작원리, 구조, DFS와 BFS의 비교, 효율적인 사용처 등 더 자세한 이해를 위해 공부를 해야겠다.
문제