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 | 31 |
Tags
- 알고리즘
- Programmers
- 큐
- StringTokenizer
- lv0
- 삼각형의 완성조건
- 프로그래머스
- 스택
- Lv1
- 스프링부트 도커로 배포
- index of
- 클라이언트
- 자바
- 백준 N과 M 자바
- Stack
- Queue
- 오름차순 정렬
- 문자열
- 스프링부트 도커 배포
- java
- 이진수 변환
- 프로그래머스 문자열 정렬
- lv2
- 버퍼
- 프로그래머스 자바
- SWEA
- 프로그래머스 풀이
- COS Pro
- 백준
- 스프링부트 도커
Archives
- Today
- Total
mun dev
[백준] 21736 헌내기는 친구가 필요해 자바(Java) 본문
문제설명
2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고 싶다.
도연이가 다니는 대학의 캠퍼스는 NxM크기이며 캠퍼스에서 이동하는 방법은 벽이 아닌 상하좌우로 이동하는 것이다. 예를 들어, 도연이가 (x,y)에 있다면 이동할 수 있는 곳은(x+1, y), (x, y+1), (x-1, y), (x, y-1)이다. 단, 캠퍼스의 밖으로 이동할 수는 없다.
불쌍한 도연이를 위하여 캠퍼스에서 도연이가 만날 수 있는 사람의 수를 출력하는 프로그램을 작성해보자.
입력
첫째 줄에는 캠퍼스의 크기를 나타내는 두 정수 N (1≤N≤600), M (1≤M≤600)이 주어진다.
둘째 줄부터 N개의 줄에는 캠퍼스의 정보들이 주어진다. O는 빈 공간, X는 벽, I는 도연이, P는 사람이다. I가 한 번만 주어짐이 보장된다.
출력
첫째 줄에 도연이가 만날 수 있는 사람의 수를 출력한다. 단, 아무도 만나지 못한 경우 TT를 출력한다.
풀이
도연이의 위치에서 만날 수 있는 사람의 위치를 출력하기 때문에 DFS를 사용해서 풀이했다. 방문하지 않았고 X가 아니라면 상, 하, 좌, 우로 돌아가며 만날 수 있는 사람을 찾고 카운트를 증
통과한 코드 ✅
import java.util.*;
import java.io.*;
public class Main {
public static char map[][];
public static boolean visited[][];
public static int dx[] = {0, 0, 1, -1};
public static int dy[] = {1, -1, 0, 0};
public static int n, m, cnt;
public static int cx, cy;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new char[n][m];
visited = new boolean[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
String s = st.nextToken();
for (int j = 0; j < m; j++) {
if(s.charAt(j)=='I'){
cx=i;
cy=j;
}
map[i][j] = s.charAt(j);
}
}
dfs(cx,cy);
check();
}
public static void dfs(int x, int y) {
visited[x][y] = true;
if(map[x][y]=='P') cnt++;
for (int i = 0; i < 4; i++) {
int cx = x + dx[i];
int cy = y + dy[i];
if (cx >= 0 && cy >= 0 && cx < n && cy < m ) {
if (!visited[cx][cy] && map[cx][cy] != 'X') {
dfs(cx, cy);
}
}
}
}
public static void check() {
if (cnt <= 0) {
System.out.println("TT");
} else {
System.out.println(cnt);
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1182 부분수열의 합 자바(Java) (0) | 2023.11.10 |
---|---|
[백준] 7569 토마토 자바(Java) (0) | 2023.11.07 |
[백준] 17413 단어 뒤집기2 자바(Java) (0) | 2023.11.06 |
[백준] 5014 스타트링크 자바(Java) (1) | 2023.11.03 |
[백준] 3986 좋은단어 자바(Java) (1) | 2023.11.03 |