https://www.acmicpc.net/problem/1520
1520๋ฒ: ๋ด๋ฆฌ๋ง ๊ธธ
์ฒซ์งธ ์ค์๋ ์ง๋์ ์ธ๋ก์ ํฌ๊ธฐ M๊ณผ ๊ฐ๋ก์ ํฌ๊ธฐ N์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด์ด ๋ค์ M๊ฐ ์ค์ ๊ฑธ์ณ ํ ์ค์ N๊ฐ์ฉ ์์์๋ถํฐ ์ฐจ๋ก๋ก ๊ฐ ์ง์ ์ ๋์ด๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
www.acmicpc.net
ํ์ด๊ณผ์
(r,c)์์ ๋ชฉ์ ์ง (M-1,N-1)๊น์ง ๊ฐ ์ ์๋ ๋ชจ๋ ๊ฒฝ๋ก์ ๊ฐฏ์๋
(r,c)์ ์ธ์ ํ (nr,nc)์์ ๋ชฉ์ ์ง (M-1,N-1)๊น์ง ๊ฐ ์ ์๋ ๊ฒฝ๋ก ๊ฐฏ์์ ํฉ์ด๋ค.
์ ๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค
๋ณดํต์ bottom-up ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ dp๊ฐ ์๋์๋ค.
๋ฉ๋ชจ๋ฆฌ์ ์ด์ ๋ฐฉ๋ฒ
๋ฐฉ๋ฌธ์ฒดํฌ ๋ฐฐ์ด(visited) ์ ๋ฌ์ ๊ณ์ฐ์ด ์๋ฃ๋ ์ขํ์ ๊ฒฝ์ฐ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ๋ ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ด์ ์ ๊ตฌํํ๋ค.
static int solve(int r,int c){
if(r==M-1 && c==N-1){
return 1;
}
if(visited[r][c]){ // ๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด ๊ฒฐ๊ณผ ๋ฆฌํด (์ค๋ณต์ฐ์ฐ ์ค์)
return memo[r][c];
}
visited[r][c]=true; // ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
for(int d=0;d<4;d++){
int nr = r + dr[d];
int nc = c + dc[d];
if(nr<0 || nr>=M) continue;
if(nc<0 || nc>=N) continue;
if(arr[r][c] > arr[nr][nc]){
memo[r][c] += solve(nr,nc);
}
}
return memo[r][c];
}
์ ์ฒด์ฝ๋
package com.mincheolsong;
import java.io.*;
import java.util.*;
public class Main {
static int M,N;
static int[][] arr;
static int[][] memo;
static int[] dr = {-1,0,1,0};
static int[] dc = {0,1,0,-1};
static boolean[][] visited;
static int solve(int r,int c){
if(r==M-1 && c==N-1){
return 1;
}
if(visited[r][c]){ // ๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด ๊ฒฐ๊ณผ ๋ฆฌํด (์ค๋ณต์ฐ์ฐ ์ค์)
return memo[r][c];
}
visited[r][c]=true; // ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
for(int d=0;d<4;d++){
int nr = r + dr[d];
int nc = c + dc[d];
if(nr<0 || nr>=M) continue;
if(nc<0 || nc>=N) continue;
if(arr[r][c] > arr[nr][nc]){
memo[r][c] += solve(nr,nc);
}
}
return memo[r][c];
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
arr = new int[M][N];
memo = new int[M][N]; // memo[0][0] : (0,0)์์ (M-1,N-1)๊น์ง ๊ฐ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ฅ
visited = new boolean[M][N];
for(int i=0;i<M;i++){
st = new StringTokenizer(br.readLine());
for(int j=0;j<N;j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
System.out.println(solve(0,0));
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
visited๋ฐฐ์ด์ด 3์ฐจ์์ธ bfs ์ต๋จ๊ฒฝ๋ก ํ์ ๋ฌธ์ (๋ฐฑ์ค 1600๋ฒ) (2) | 2024.02.28 |
---|---|
์ด๋ถ ๊ทธ๋ํ (๋ฐฑ์ค 1707) (0) | 2024.02.22 |
๊ตฌํ, ๋ฐฑํธ๋ํน (15684 ์ฌ๋ค๋ฆฌ ์กฐ์) (0) | 2024.02.16 |
๋ฐฑํธ๋ํน(14890 ๊ฒฝ์ฌ๋ก) (2) | 2024.02.14 |
BFS (๋ฐฑ์ค 16234 ์ธ๊ตฌ์ด๋) (1) | 2024.02.09 |