본문 바로가기

코딩테스트

[D4-JAVA] SWEA 1210 - ladder

728x90
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

✅ 문제 요약

흔히 우리가 평소에 하는 사다리 게임이라고 생각하면 된다.

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
반응형