반응형
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
- 12930
- 백준
- 132202
- 146355
- 59412
- java
- 14942
- 싸피
- MySQL
- SSAFY
- softeer
- 퍼즐 조각 채우기
- 설명
- 오블완
- 티스토리챌린지
- 165672
- 핵심
- PCCP
- 소프티어
- 프로그래머스
- SQL
- 10기
- 해결
- 59409
- 진료과별 총 예약 횟수 출력하기
- 조건에 부합하는 중고거래 상태 구하기
- 후기
- 수료
- 정기 코딩 인증평가
- 142085
Archives
- Today
- Total
개발 쥬스
[백준/Java] 1189번 컴백홈 본문
반응형
🔗 문제 링크: https://www.acmicpc.net/problem/1189
🔍 해결 과정
왼쪽 아래에서 오른쪽 위까지의 다양한 경로 중 k번 이동한 경로와 일치한 경우의 수를 구하는 문제이고, R과 C의 최댓값이 5이므로 dfs(Depth-First Search) 방식을 활용하여 오른쪽 위에 도달했을 때 k번 이동했는지의 경우를 확인하고 일치하면 경우를 세어주는 과정으로 코드를 구현하였습니다. dfs를 활용했을 때 O(R x C) 의 시간복잡도를 가지므로 제한 시간 안에 프로그램을 실행할 수가 있습니다.
✏️ 코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static final char BLOCK = 'T';
private static final int[] DX = {-1, 0, 1, 0};
private static final int[] DY = {0, 1, 0, -1};
private static int r, c, k;
private static char[][] board;
private static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken()); // 이동하는 가짓수
board = new char[r][c];
visited = new boolean[r][c];
for (int i = 0; i < r; ++i) {
board[i] = br.readLine().toCharArray();
}
int startR = r - 1;
int startC = 0;
int endR = 0;
int endC = c - 1;
bw.write(Integer.toString(getResult(startR, startC, endR, endC, 1)));
bw.flush();
bw.close();
}
private static int getResult(int curR, int curC,
final int endR, final int endC, int step) {
if (curR == endR && curC == endC) {
if (step == k) {
return 1;
}
return 0;
}
int count = 0;
visited[curR][curC] = true;
for (int dir = 0; dir < 4; ++dir) {
int nx = curR + DX[dir];
int ny = curC + DY[dir];
if (!isValid(nx, ny)) {
continue;
}
count += getResult(nx, ny, endR, endC, step + 1);
}
visited[curR][curC] = false;
return count;
}
private static boolean isValid(int x, int y) {
return !(x < 0 || y < 0 || x >= r || y >= c) && !visited[x][y] && board[x][y] != BLOCK;
}
}
반응형
'알고리즘' 카테고리의 다른 글
[백준/Java] 3649 로봇 프로젝트 (0) | 2024.08.11 |
---|---|
[백준/Java] 4358 생태학 (0) | 2024.08.08 |
[프로그래머스/Java] 42587 프로세스 (0) | 2024.08.05 |
[백준/Java] 1374번 강의실 (0) | 2024.08.05 |
[백준/Java] 1034번 램프 (0) | 2024.08.03 |