인프런 커뮤니티 질문&답변

Sung Rak님의 프로필 이미지
Sung Rak

작성한 질문수

코딩테스트 전 꼭 알아야 할 개념과 문제(with 자바)

섬의수(NumberOfIsland) BFS _문제해설

BFS 문제 질문

작성

·

161

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++;
}
}

}
}
}

답변 3

2

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

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

첨언하면)

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

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

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

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

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

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

그냥 코딩의 핵입니다.

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

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

2

네 안녕하세요~

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

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

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

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

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

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

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

감사합니다.

1

Sung Rak님의 프로필 이미지
Sung Rak
질문자

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

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

Sung Rak님의 프로필 이미지
Sung Rak

작성한 질문수

질문하기