728x90
✅ 문제 요약
흔히 우리가 평소에 하는 사다리 게임이라고 생각하면 된다.
100 x 100인 2차원 배열에서 y(행) = 99 이며 그 값이 2인 도착점으로 갈 수 있는
y(행) = 0 이며 그 값이 1인 시작점을 찾는 문제다.
🤔문제 접근
처음 문제를 풀 때 배열의 값을 입력받으며 만약 y=99이고 그 값이 2인 경우
x.y좌표를 저장해놓고 도착지에서 역순으로 시작점을 찾도록 코드를 짰다.
도착지에서 왼쪽(x-1), 오른쪽(x+1)의 값이 1이라면 더이상 1이 나오지 않을 때까지 왼쪽, 오른쪽으로
전진했으며 아닐 경우 y-1을 해주어 위로 전진하도록 했다.
되게 단순하게 풀 수 있었음에도 한가지 간과한 것이 있었으니 그때그때 전진할때마다
왼쪽, 오른쪽의 값이 1인지를 체크했는데 왼쪽 혹은 오른쪽으로 전진을 하던 중 만약
지나왔던 이전 값이 1이라면 다시 되돌아가고 다시 전진하고.. 하여 무한루프에 빠졌고
결국 문제를 풀지 못했다.
이것을 방지하기 위해 지나온 이전 길의 값을 전진할 수 없는 값인 0으로 바꾸어주거나
visit 배열을 두고 방문처리를 하여 다시 되돌아가지 않도록 했었어야 했다.
추후 코딩테스트에서 비슷한 문제가 나왔을 경우 이런 실수를 반복하지 않도록 조심 해야겠다.
🚨CODE
import java.io.*;
import java.util.*;
class Solution {
static int[][] map;
static int answer;
static int[][] deltas = { { 0, -1 }, { 0, 1 }, { -1, 0 } };
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = 10;
for (int test_case = 1; test_case <= T; test_case++) {
int testNum = Integer.parseInt(br.readLine());
map = new int[100][100];
int x = 0;
int y = 99;
for (int i = 0; i < 100; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 100; j++) {
int num = Integer.parseInt(st.nextToken());
map[i][j] = num;
if (i == 99 && map[i][j] == 2)
x = j;
}
}
int nx, ny;
while (y != 0) {
for (int i = 0; i < 3; i++) {
nx = x + deltas[i][1];
ny = y + deltas[i][0];
if (nx < 0 || nx >= 100 || ny < 0 || ny >= 100 || map[ny][nx] == 0)
continue;
x = nx;
y = ny;
map[ny][nx] = 0;
}
}
bw.write(String.format("#%d %d\n", testNum, x));
} // end of testcase
bw.flush();
}
}
728x90
반응형
'코딩테스트' 카테고리의 다른 글
[JAVA-D3] SWEA 1493 - 수의 새로운 연산 (0) | 2024.04.24 |
---|---|
[D4-JAVA] SWEA 1238 - Contact (1) | 2024.04.19 |
[Silver4-JAVA] 백준 10610 - 30 (0) | 2024.04.14 |
[D2-JAVA] SWEA - 백만장자 프로젝트 (0) | 2024.04.10 |
[Gold4-JAVA] 백준 1647 - 도시 분할 계획 (0) | 2024.04.05 |