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
- leetcode
- java
- Thymeleaf
- gold2
- CSS
- LEVEL1
- gold5
- LEVEL2
- 오류
- 9252
- 개념
- AWS
- glod5
- siver3
- Gold4
- LCS
- 구현
- error
- glod4
- spring
- 프로그래머스
- 백엔드
- leetcode 69
- 배포
- mysql
- 백준
- Kakao
- HTML
- jpa
- PYTHON
Archives
- Today
- Total
이 험난한 세상에서어어~
백준, 늑대와 양(16956, java) 본문
문제 설명
일단 들어가기 전에 먼저 알아야 할 것은 해당 문제에는 스페셜 저지가 있다는 의미이다. 꼭 예제에 있는 출력만이 답이 아니라는 의미로 조건만 맞으면 다른 출력도 답으로 인정이 된다.
또한 울타리의 최소 갯수를 구하는 문제가 아니다. 위의 두 조건을 모르고 풀었을 때는 왜 이 문제가 실버 3밖에 되지 않는지 이해할 수 없었지만, 조건들을 알고 나니 굉장히... 사실 어느 기교도 없이 풀 수 있는 문제였다.
문제 풀이
그냥 늑대의 사방에 울타리를 씌우면 끝이 난다. 그냥... 이게 문제 풀이의 전부이다.
1. 지도 정보를 받을 때 늑대의 위치를 큐에 넣는다.
2. BFS에서 하듯이 큐에서 값을 하나씩 꺼내서 해당 위치의 사방에 접근한다.
3. 만일 접근한 곳에 .이 있으면 D를 표시해 울타리를 세운다.
4. S가 있다면 이 의미는 울타리를 세우지 못해 양이 공격받는 것이니 false를 반환한다.
코드
java
import java.util.*;
import java.io.*;
class Pair {
int row;
int col;
Pair(int row, int col) {
this.row = row;
this.col = col;
}
}
public class Main {
public static int R, C;
public static char[][] map;
public static int[] dR = {-1, 0, 1, 0};
public static int[] dC = {0, 1, 0, -1};
public static Queue<Pair> queue;
public static boolean bfs() {
while (!queue.isEmpty()) {
Pair current = queue.poll();
int cR = current.row;
int cC = current.col;
for (int i=0; i<4; i++) {
int nR = cR + dR[i];
int nC = cC + dC[i];
if (nR >= 0 && nR < R && nC >= 0 && nC < C) {
if (map[nR][nC] == '.' ) {
map[nR][nC] = 'D';
}
if (map[nR][nC] == 'S') {
return false;
}
}
}
}
return true;
}
public static void display() {
for (int i=0; i<R; i++) {
for (int j=0; j<C; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
map = new char[R][C];
queue = new LinkedList<>();
for (int i=0; i<R; i++) {
String s = br.readLine();
for (int j=0; j<C; j++) {
map[i][j] = s.charAt(j);
if (map[i][j] == 'W') {
queue.add(new Pair(i, j));
}
}
}
if (bfs()) {
System.out.println("1");
display();
} else {
System.out.println("0");
}
}
}
'algorithm > 코딩 테스트' 카테고리의 다른 글
백준, 종이의 개수(1780, java) (1) | 2023.09.07 |
---|---|
백준, 안전 영역(2468, java) (0) | 2023.09.07 |
백준, 마법사 상어와 비바라기(21610, java) (0) | 2023.08.11 |
백준, 테트로미노(14500, java) (0) | 2023.08.09 |
백준, 이차원 배열과 연산(17140, java), 75%에서 틀리는 이유 (0) | 2023.08.08 |