Study/Problem Solving
[SWEA / Java] 1210번: Ladder1 (D4)
Pearlii
2023. 8. 1. 16:14
문제 풀이 날짜: 2023.08.01
포스트 작성일: 2023.08.01
* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.
문제 출처
SWEA 1210번: Ladder1 (D4)
키워드
배열 탐색
풀이 접근법
- 입력 배열 중, 2가 적힌 곳의 좌표로부터 시작점을 찾아가는 탐색 문제.
- 배열의 맨 아래부터 위로 올라가거나 왼쪽, 오른쪽으로 이동하면 되기 때문에 delta 배열에는 왼쪽, 오른쪽, 위쪽 방향의 변량만 정의한다.
private static int[] dr = { 0, 0, -1 }; private static int[] dc = { -1, 1, 0 };
- 왼쪽, 오른쪽 사다리를 만나면 무조건 이동해야 하기 때문에 왼쪽, 오른쪽 방향은 위쪽 방향보다 우선권을 가진다. 따라서 delta 배열에서 위쪽 이동의 변량을 가장 마지막 원소로 정의한다.
- 위쪽으로 이동하다가 왼쪽, 오른쪽 좌표에 1이 있다면 (사다리가 있다면) 해당 방향으로 이동한다. 이동하고 다음 이동을 위해 현재 좌표를 갱신해준다.
- 이 때, 이미 방문했던 곳을 다시 방문할 수 없도록 배열 값을 1 이외의 값으로 수정한다. 만약 재방문을 막지 않았다면 사다리를 건넜다가 다시 원래 지점으로 되돌아갈 수도 있다.
코드
import java.util.*;
import java.io.*;
public class Solution {
private static final int N = 10;
private static int[] dr = { 0, 0, -1 };
private static int[] dc = { -1, 1, 0 };
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = 1;
int[][] matrix = new int[N][N];
StringBuilder sb = new StringBuilder();
for (int test_case = 1; test_case <= T; test_case++) {
int tc = Integer.parseInt(br.readLine());
int startR = 0;
int startC = 0;
StringTokenizer st;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
matrix[i][j] = Integer.parseInt(st.nextToken());
if (matrix[i][j] == 2) {
startC = j;
startR = i;
}
}
}
int result = move(matrix, startR, startC);
sb.append("#").append(test_case).append(" ").append(result).append("\n");
}
System.out.println(sb);
}
private static int move(int[][] matrix, int r, int c) {
int nr = 0;
int nc = 0;
while (nr >= 0 && nc >= 0) {
for (int i = 0; i < dr.length; i++) {
nr = r + dr[i];
nc = c + dc[i];
if (!isValid(nr, nc)) {
continue;
}
if(matrix[nr][nc] == 1) {
matrix[nr][nc] = 3;
r = nr;
c = nc;
}
}
}
return nc;
}
private static boolean isValid(int nr, int nc) {
return (nr > -1 && nc > -1 && nr < N && nc < N);
}
}
git 링크
(git 링크 첨부)