강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của wjdals3000183
wjdals3000183

câu hỏi đã được viết

Các khái niệm và vấn đề bạn phải biết trước khi thi viết code (với Java)

NumberOfIsland BFS_Problem Giải thích

BFS 문제 질문

Viết

·

248

1

안녕하세요.

BFS 강의를 보고 응용하여 타사이트 문제도 도전해서 풀어보면서 적용이 되는것에 재미를 느끼고 있습니다.

하지만, 약간의 응용문제를 풀려고 하니 쉽지않네요. ㅠㅠ

프로그래머스 문제 (카카오 컬러링북) 아래 링크 걸어두었습니다.

https://programmers.co.kr/learn/courses/30/lessons/1829

-> 카카오컬러링북 BFS 문제인데 

강사님께서 강조하시던

1. 마이너스 좌표체크 2. m*n 범위체크 3. grid[x][y] 값체크(문제제시값) 을 하면 해당범위에 잘걸리지않아

카운트가 잘 되지 않고 있습니다. ㅠㅠ

코드는 적어서 올려볼게요.

피드백 주시면 감사하겠습니다 ㅠㅠ

* 추가적으로 0과 1이 아닌 아래 문제처럼 1, 2, 3 색깔별로

찾는 문제도 있으면 응용에 도움이 많이 될것같습니다.

package com.algoStudy.algo0128;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class BFSTest_04 {
// 카카오문제
public static void main(String[] args) {

int m = 6, n= 4;
int[][] grid = {
{'1', '1', '1', '0'},
{'1', '2', '2', '0'},
{'1', '0', '0', '1'},
{'0', '0', '0', '1'},
{'0', '0', '0', '3'},
{'0', '0', '0', '3'}
};

System.out.println(new BFSTest_04().solution(m, n, grid));

}

// 전역변수 선언
// int m,n = 0; // 가로 세로 구하기위해 셋팅 0,0 부터 시작이면 이미 선언되어있음 6x4
int[][] dirs = {{1,0}, {-1,0}, {0,1}, {0,-1}}; // 아래,,오른,
int size = 0;

public int[] solution(int m, int n, int[][] picture) {
int numberOfArea = 0;
int maxSizeOfOneArea = 0;

// grid에 필요한 그림 그리기 및 영역 표시 확인 후 카운트 새기
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(picture[i][j] != '0') { // 값이 해당값에 포함되어있다면, 즉 영역이라면 증가시키고 bfs 칠해주기
size = 0;
numberOfArea++; // 육지 갯수 카운트
bfs(picture, m, n); // 남은영역 0 칠해주기
if(maxSizeOfOneArea < size)
maxSizeOfOneArea = size;
}
}
}

int[] answer = new int[2];
answer[0] = numberOfArea;
answer[1] = maxSizeOfOneArea;

System.out.println(Arrays.toString(answer));

return answer;
}

private void bfs(int[][] grid, int x, int y) {
// bfs는 큐방식을 선언해주는게 이상적
Queue<int[]> que = new LinkedList<>();
que.offer(new int[] {x,y});

while(!que.isEmpty()) { // 값이 있으면
int[] point = que.poll(); // 즉시 빼기기

// 방향 찾아서 0으로 칠하기
for (int[] dir : dirs) {
int x1 = point[0] + dir[0];
int y1 = point[1] + dir[1];
// 1. 마이너스 좌표체크 2. m*n 범위체크 3. grid[x][y] 값체크(문제제시값)
if (x1 >= 0 && y1 >= 0 && x > x1 && y > y1 && grid[x1][y1] != '0') {
grid[x1][y1] = '0';
que.offer(new int[] {x1, y1});
size++;
}
}

}
}
}
java코테 준비 같이 해요!

Câu trả lời 3

2

pushupman님의 프로필 이미지
pushupman
Người chia sẻ kiến thức

안녕하세요. bfs 응용강의 5번문제로 올려놨습니다. 응용해서 풀었기에 문제가 비슷할겁니다.

강의보시고 이해 안되시면글 남겨주세요~

첨언하면)

bfs 기본공식에 살을 붙여서 충분히 다 해결가능합니다.

어떠한 문제가 나오더라도 , 해결 가능합니다. 곧 어떠한 회사 코딩테스트도 통과가 가능합니다.

 자신감을 가지고 더 하시면 충분히 좋은 결과가 나올겁니다. 제 강의 전달이 약간 부족할 수도 있지만

기본기를 확실히 심어주도록 만들었습니다. bfs/dfs 에 재미를 붙이셨다면 다행입니다.(모든회사에서 제일 좋아하는 문제죠

한방에 경쟁자 10명중에 8명을 거르도록 하는문제들입니다)

bfs/dfs는  앞단의 기본기 string , array는 기본 이해하면서 어디서 맞게 호출할지 , 어디서 에러를 걸어야할지를 체크합니다.

그냥 코딩의 핵입니다.

요새 환경은 코딩테스트를  통과해야지. 자바 스프링을 구축하고, 머신러닝을 할 수 있습니다.

 이건 문제 도출 아이디어입니다.

2

pushupman님의 프로필 이미지
pushupman
Người chia sẻ kiến thức

네 안녕하세요~

열심히 하시는군요~~^^;

이 재미를 느낄때 중요한 순간이죠..bfs/dfs만 열심히 풀어제껴도 성공가능합니다.

카카오 셤 문제 7개중에서 bfs/dfs문제는 5~6번째 쯤 나옵니다. 그만큼 난이도가 있다는 거죠?

그리고 정답률이 5%이하입니다. 무슨 말이냐..그거 풀면 합격가능하다는 얘기가 됩니다. 

초반 문제 string , array보다 배점이 확실히 높겠죠?

어떤 년도에는  bfs/dfs가 2개 나왔습니다.  그 해에 bfs/dfs를 준비 안한 수험생은 아마 대부분 탈락했을겁니다.

하여튼 질문주신 문제는 제 공식을 적용해서 풀어보도록 하겠습니다.

감사합니다.

1

Sung Rak님의 프로필 이미지
Sung Rak
Người đặt câu hỏi

넵 감사합니다. 여기에 답변이 달리는건가용??  강의랑 비슷하게 푼 문제는 영역갯수, 색깔이 가장많이 칠해진거까지는 구해봤는데

저 문제는 저 공식으로는 대입이 어려워 보이네요 ㅠㅠ

Hình ảnh hồ sơ của wjdals3000183
wjdals3000183

câu hỏi đã được viết

Đặt câu hỏi