250x250
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
- 코테준비
- 중복조합
- 주사위굴리기2
- 완탐
- 백준
- BFS
- N과M
- D드라이브생성
- 정보처리기사
- 재귀함수
- 코테
- 알고리즘
- 에라토스테네스의채
- 백준2251
- 백준13458
- 완전탐색
- 중복순열
- 백준15652
- 전화번호속의암호
- 자바
- 23288
- 순열
- 파티션 크기 조정
- 삼성역테
- 볼륨 만들기
- 자바 코테
- 알고리즘개념
- 정올 1620
- java
- Bfs와DFS
Archives
- Today
- Total
뚱땅뚱땅
[문제] 백준 3184번 양 본문
728x90
내 풀이
bfs 함수에서 for문으로 4방 탐색 안하고 while 문에서 x,y를 업데이트하는 식으로 했는데 틀렸다!
for 문으로 4방 탐색하는게 안전한 듯 하다.
public class BOJ_3184 {
static int[] dx = { 0, 1, 0, -1 };
static int[] dy = { 1, 0, -1, 0 };
static int R, C;
static char[][] matrix;
static int sheep = 0, wolf = 0; // 최종 양과 늑대 수
static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
R = Integer.parseInt(st.nextToken()); //세로
C = Integer.parseInt(st.nextToken()); // 가로
matrix = new char[R][C];
visited = new boolean[R][C]; //방문 체크
// init matrix
for (int i = 0; i < R; i++) {
String s = in.readLine();
for (int j = 0; j < C; j++) {
char c = s.charAt(j);
matrix[i][j] = c;
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (matrix[i][j] == 'o' || matrix[i][j] == 'v') { // 양이나 늑대가 있는 시점에서 탐색
if (!visited[i][j]) { // 아직 방문하지 않은 영역이라면 탐색 시작
bfs(i, j);
}
}
}
}
// sheep, wolf 출력
System.out.println(sheep + " " + wolf);
}
static void bfs(int a, int b) {
Queue<int[]> q = new LinkedList<>();
int s = 0, w = 0; // 해당 영역에서 양과 늑대 수 세기
visited[a][b] = true; // (a,b) 방문
if (matrix[a][b] == 'v')
w++;
else if (matrix[a][b] == 'o')
s++;
q.offer(new int[] { a, b });
while (!q.isEmpty()) {
int[] loc = q.poll(); // 현재 위치
int x = loc[0];
int y = loc[1];
// 사방 탐색
for (int d = 0; d < 4; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if (nx >= 0 && nx < R && ny >= 0 && ny < C && matrix[nx][ny] != '#' && !visited[nx][ny]) {
if (matrix[nx][ny] == 'o') {
s++;
} else if (matrix[nx][ny] == 'v') {
w++;
}
visited[nx][ny] = true;
q.offer(new int[] { nx, ny });
}
}
}
// 양이 더 많으면 늑대 x
if (s > w) {
sheep+= s;
}
else { // 늑대가 양보다 같거나 많으면 양 x
wolf += w;
}
}
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[문제] 백준 11725번 트리의 부모 찾기 (0) | 2021.02.12 |
---|---|
[문제] 백준 16948 데스나이트 (0) | 2021.02.12 |
[문제] 백준 16935번 배열 돌리기 3 (0) | 2021.02.11 |
[문제] 백준 17406번 배열 돌리기 4 (0) | 2021.02.11 |
[문제] 백준 12789번 도키도키 간식드리미 (0) | 2021.02.11 |
Comments