Hansel
백준_14890(구현) 본문

단순 구현 문제이며 경사로가 설치되는 조건과 설치되면 안되는 예외를 잘 설정해주면 어렵지 않다.
하지만 그걸 못해서 처음엔 dfs로 하다가 예외처리를 해주지 못해 망했고 결국 도움을 좀 받았다.
지도의 경우 좌->우로 탐색하는 경우와 위->아래로 탐색하는 두가지 경우가 있는데 이걸 배열의 행을 N*2까지 만들어 좌->우 & 위->아래를 하나의 배열로 만들어 주면 문제가 훨씬 쉬워진다.
따라서 1~N*2까지 좌->우로만 탐색하며 조건에 맞게 탐색하면 끝난다.
1. 임시 배열 하나를 만들어서 현재 탐색하는 행의 진행을 저장하는 방식으로 한다.
2. 숫자가 같을땐 임시 배열의 현재 열 위치에 이전 열+1을 해준다.
3. 현재 숫자가 이전의 숫자보다 1만큼 크다면 오르막을 위한 경사로를 설치해야 한다
=> 지금까지 온 거리가 (임시 배열에 저장된 숫자) L보다 크다면 오르막을 오르고 임시 배열의 현 위치에 1을 설정해준다.
4. 현재 숫자가 이전의 숫자 보다 1만큼 작다면 내리막을 위한 경사로를 설치해야 한다.
=> 임시 배열의 j-1이 0보다 크거나 같다면 (아래로 내려갈 수 있는지 => 경사로가 삐져나오거나 겹쳐있지 않은 경우) 내려가고 임시 배열에 현 위치엔 (1-L)을 해준다(경사로만큼 감소시켜야 다음 위치에서 경사로를 설치할 수 있는지 판단이 가능하다)
package Feb_2022;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Boj_14890 {
static int N;
static int L;
static int[][] board;
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()); // 맵의 가로 세로 크기
L = Integer.parseInt(st.nextToken()); //경사로 길이
board = new int[N * 2 + 1][N + 1];
for (int i = 1; i <= N; i++) { //지도 입력
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= N; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
board[j + N][i] = board[i][j];
}
}
// for (int i = 1; i <= N*2; i++) { //테스트
// for (int j = 1; j <= N; j++) {
// System.out.print(board[i][j] + " ");
// }
// System.out.println();
// }
int result = 0;
for (int i = 1; i <= N*2; i++) { // 아래로 쭉
int[] dp = new int[N+1];
dp[1] = 1;
dp[N]= -1;
for(int j=2;j<=N;j++){ //오른쪽으로 쭉
if(board[i][j]==board[i][j-1]){ //같은 숫자인 경우 => 경사로가 필요 없는 경우
dp[j] = dp[j-1]+1;
}
else if(board[i][j]-1 == board[i][j-1]){ //오르막인 경우
if(dp[j-1] >= L)
dp[j] = 1;
else
break;
}
else if(board[i][j-1]-1 == board[i][j]){ //내리막인 경우
if(dp[j-1] >= 0)
dp[j] = (1-L);
else
break;
}
else
break;
}
if(dp[N]>=0){
//System.out.println(i);
result++;
}
}
System.out.println(result);
}
}'알고리즘과 자료구조 > 구현 및 기타' 카테고리의 다른 글
| 백준_1283(구현) (0) | 2022.04.20 |
|---|---|
| 백준_2110(이분 탐색) (0) | 2022.03.12 |
| 백준_15684(브루트포스) (0) | 2022.02.18 |
| 백준_14499(구현) (0) | 2022.02.10 |
| (C++)백준 11049/행렬곱셈 (0) | 2022.02.04 |