๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1890)
< ์ ํ >
๋ฌธ์ ํ์ด
๊ฒ์ ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด, ์ด๋ ์์น๋ฅผ ํ์ํ๋ ๋ฐฐ์ด, ๊ฒฝ๋ก ์๋ฅผ ๊ตฌํ๋ ๋ฐฐ์ด ์ด 3๊ฐ์ ๋ฐฐ์ด์ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๋ง์ฝ ๋ฌธ์ ์์ ์ฃผ์ด์ง ์์ ๋ก ์ค๋ช ํด ๋ณด์.
4
2 3 3 1
1 2 1 3
1 2 3 1
3 1 1 0
์ ๊ฐ์ด ์์ ๊ฐ ์ฃผ์ด์ก๋ค๋ฉด ์ด๋ ์์น๋ฅผ ํ์ํ๋ ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฒฝ๋ก ์๋ฅผ ๊ตฌํ๋ ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฐ ๊ฒฝ๋ก๋ ๊ฐ์ ์ด๋ ๋ฒํธ์ธ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ฐ๋ก ๊ด๋ฆฌํ๋ค. ์์์ 4๋ฒ ์ด๋ํ์ฌ ์ค๋ฅธ์ชฝ ์๋๋ก ์ค๋ ๊ฒฝ์ฐ๊ฐ 2๊ฐ์ง์๊ณ 5๋ฒ ์ด๋ํด์ ์ค๋ฅธ์ชฝ ์๋ ๋์ฐฉํ๋ ๊ฒฝ์ฐ๊ฐ 1๊ฐ์ง์ด๋ฏ๋ก ๋จผ์ ๋์ฐฉํ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฐ๋ก ์ ์ฅํด ๋๊ณ 1๋ก ์ ์ฅํ๋ค.
๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ ์ด๋ ๋ฒํธ๋ก ํ์ํ๋ฉด ์์ง ๋ชจ๋ ๊ฒ์ ํ์ ์ํํ์ง ์์๋๋ฐ ์๋ก์ด ๊ฐ์ผ๋ก ๊ฐฑ์ ๋ ์ ์์ผ๋ฏ๋ก ArrayList๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ฅํด ๋๋ค๊ฐ ๋ชจ๋ ํ์์ด ๋๋ ํ ํ ๋ฒ์ ๊ฐ์ ๊ต์ฒดํ๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class _1890_ { // ์ ํ
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(bf.readLine());
int arr[][] = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(bf.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
long move[][] = new long[n][n];
long count[][] = new long[n][n];
move[0][0] = 1;
count[0][0] = 1;
long idx = 1;
boolean flag = false;
long result = 0;
ArrayList<long[]> list = new ArrayList<>();
while (true) {
flag = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == n - 1 && j == n - 1) {
continue;
}
if (move[i][j] == idx) {
if (arr[i][j] == 0) {
continue;
}
flag = true;
if (j + arr[i][j] < n) {
list.add(new long[] { i, j + arr[i][j], count[i][j] });
}
if (i + arr[i][j] < n) {
list.add(new long[] { i + arr[i][j], j, count[i][j] });
}
}
}
}
for (long[] temp : list) {
int a = (int) temp[0];
int b = (int) temp[1];
if (move[a][b] != idx + 1) {
if (a == n - 1 && b == n - 1) {
result += count[a][b];
}
count[a][b] = 0;
}
move[a][b] = idx + 1;
count[a][b] += temp[2];
}
idx++;
list.clear();
if (!flag) {
break;
}
}
System.out.println(result + count[n - 1][n - 1]);
}
}
๋ณ์)
n : ๊ฒ์ํ์ ํฌ๊ธฐ
arr : ๊ฒ์ํ ์ ๋ณด
move : ์ด๋ ์์น ๋ฒํธ ํ์
count : ๊ฒฝ์ฐ์ ์ ํ์
idx : ์ด๋ ๋ฒํธ
flag : ์ด๋ํ ๊ฒ์ด ๋จ์์๋์ง ์ฌ๋ถ
result : ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก ๋์ฐฉํ๋ ๊ฒฝ๋ก์ ๊ฐ์ ์ ์ฅ
list : ๊ฐ ๊ต์ฒด๋ฅผ ์ํ ArrayList
move ๋ฐฐ์ด์ ์ ์ฒด ์ํํ๋ฉด์ ํ์ฌ ์ด๋ ๋ฒํธ์ ๊ฐ๋ค๋ฉด ์ค๋ฅธ์ชฝ ๋๋ ์๋๋ก ์ด๋ ๊ฐ๋ฅํ์ง ํ๋จ ํ ์ด๋ ๊ฐ๋ฅํ๋ค๋ฉด list์ [x ์ขํ, y ์ขํ, ๊ฒฝ๋ก ์ ]๋ฅผ ์ ์ฅํ๋ค. move ๋ฐฐ์ด ์ ์ฒด ์ํ์ด ๋๋๋ฉด ๊ฐ์ ๊ต์ฒดํ๊ธฐ ์ํด list๋ฅผ ์ํํ๋ค. ์ด๋, ์ด๋ํ ๊ณณ์ idx+1 ๊ฐ์ด ์๋๋ผ๋ฉด ์ด๋ฏธ ์ง๋๊ฐ ๊ฒฝ๋ก์ ์์ ๊ฒน์น์ง ์๊ธฐ ์ํด ๊ฐ์ ์ด๊ธฐํํ๋ค. ๋ง์ฝ ์ด๋ํ ์์น๊ฐ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋๋ผ๋ฉด ์ ๋ต์ ํฌํจ์์ผ์ผ ํ๋ฏ๋ก result์ ๊ฐ์ ์ ์ฅํ๋ค. move์ count์ ์๋ก์ด ๊ฐ์ ์ ์ฅํ๋ค.
๋ ์ด์ ์ด๋ํ ๊ณณ์ด ์๋ค๋ฉด ์ข ๋ฃํ ํ์ result+count [n-1][n-1]์ ์ถ๋ ฅํ๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 12026_BOJ ๊ฑฐ๋ฆฌ (1) | 2023.12.04 |
---|---|
[Baekjoon] 2529_๋ถ๋ฑํธ (1) | 2023.12.01 |
[Baekjoon] 1495_๊ธฐํ๋ฆฌ์คํธ (0) | 2023.11.29 |
[Baekjoon] 16194_์นด๋ ๊ตฌ๋งคํ๊ธฐ 2 (1) | 2023.11.28 |
[Baekjoon] 11052_์นด๋ ๊ตฌ๋งคํ๊ธฐ (1) | 2023.11.27 |