2026.03.11
소요 시간: 30분
나의 정답
생각했던 풀이 알고리즘 자체는 많았지만,move()구현 과정에서 사소하지만 많은 실수(col += i,col + i와 비교하는 등)가 발생해서 AI를 이용해 오류를 찾아냈음. 처음 코드를 구현할 때 제대로 작성하는 연습이 필요함class Solution { public int[] solution(String[] park, String[] routes) { int []currentLocation = new int[2]; // 현재 위치를 나타내는 배열 // 시작 지점 구하기 for (int i = 0; i < park.length; i++) { for (int j = 0; j < park[i].length(); j++) { if (park[i].charAt(j) == 'S') { currentLocation[0] = i; currentLocation[1] = j; break; } } } for (int i = 0; i < routes.length; i++) { String []route = routes[i].split(" "); String direction = route[0]; // 방향 int distance = Integer.parseInt(route[1]); // 이동 거리 move(park, currentLocation, direction, distance); } return currentLocation; } public void move(String[] park, int[] currentLocation, String direction, int distance) { int row = currentLocation[0]; int col = currentLocation[1]; switch(direction) { case "N": { for (int i = 1; i <= distance; i++) { if (row - 1 < 0 || park[row - 1].charAt(col) == 'X') { // 범위를 벗어나거나 장애물을 만났을 때 row = currentLocation[0]; col = currentLocation[1]; break; } row -= 1; } break; } case "S": { for (int i = 1; i <= distance; i++) { if (row + 1 > park.length - 1 || park[row + 1].charAt(col) == 'X') { // 범위를 벗어나거나 장애물을 만났을 때 row = currentLocation[0]; col = currentLocation[1]; break; } row += 1; } break; } case "W": { for (int i = 1; i <= distance; i++) { if (col - 1 < 0 || park[row].charAt(col - 1) == 'X') { // 범위를 벗어나거나 장애물을 만났을 때 row = currentLocation[0]; col = currentLocation[1]; break; } col -= 1; } break; } case "E": { for (int i = 1; i <= distance; i++) { if (col + 1 > park[row].length() - 1 || park[row].charAt(col + 1) == 'X') { // 범위를 벗어나거나 장애물을 만났을 때 row = currentLocation[0]; col = currentLocation[1]; break; } col += 1; } break; } } currentLocation[0] = row; currentLocation[1] = col; } }
AI 정답
contains()와indexOf()를 활용하여 더 쉽게 시작 지점을 찾아냄
move()메소드를switch를 사용하는 대신 매개변수로 방향을 전달하여 더 간단하게 구현함class Solution { public int[] solution(String[] park, String[] routes) { int[] cur = new int[2]; int H = park.length; int W = park[0].length(); // 1. 시작 지점 찾기 (indexOf와 contains를 활용하면 더 깔끔합니다) for (int i = 0; i < H; i++) { if (park[i].contains("S")) { cur[0] = i; cur[1] = park[i].indexOf("S"); break; } } // 2. 이동 명령 수행 for (String route : routes) { String[] parts = route.split(" "); String dir = parts[0]; int dist = Integer.parseInt(parts[1]); int dr = 0, dc = 0; if (dir.equals("N")) dr = -1; else if (dir.equals("S")) dr = 1; else if (dir.equals("W")) dc = -1; else if (dir.equals("E")) dc = 1; // 이동 가능 여부 체크 및 위치 업데이트 move(park, cur, dr, dc, dist, H, W); } return cur; } private void move(String[] park, int[] cur, int dr, int dc, int dist, int H, int W) { int nr = cur[0]; int nc = cur[1]; // 한 칸씩 전진하며 검사 for (int i = 1; i <= dist; i++) { int checkR = cur[0] + (dr * i); int checkC = cur[1] + (dc * i); // 범위 밖이거나 장애물(X)이면 바로 종료 (이동 취소) if (checkR < 0 || checkR >= H || checkC < 0 || checkC >= W || park[checkR].charAt(checkC) == 'X') { return; } // 검사용 임시 좌표 업데이트 nr = checkR; nc = checkC; } // 모든 루프를 무사히 통과했을 때만 실제 좌표 업데이트 cur[0] = nr; cur[1] = nc; } }