[Programmers / Level1] 172928. 공원 산책(Java)

이하얀·2024년 8월 2일
0

🕊️ 프로그래머스

목록 보기
19/43

💡 Info




입출력 조건




입출력 예시




문제 이해


  • 맵을 구성해 주어진 조건을 벗어나지 않는 이동 횟수를 카운트하면 되는 문제


알고리즘


풀이 시간 : 29분

  1. 이동 방향(N, S, W, E) HashMap으로 설정
  2. routes 순회
    • 경로 이동 시도
    • 공원 경계 벗어나거나, 장애물 X에 닿으면 종료
  3. 최종 위치 반환
  4. 별도 메서드 : 시작 위치를 찾는 메서드 구현(answer 배열에 넣을 것)
 import java.util.*;

class Solution {
    public int[] solution(String[] park, String[] routes) {
        
        //getAnswer 적용해야 할 듯..?
        int[] answer = {};
        
        Map<Character, int[]> coord = new HashMap<>();
        
        coord.put('N', new int[]{-1, 0});
        coord.put('S', new int[]{1, 0});
        coord.put('W', new int[]{0, -1});
        coord.put('E', new int[]{0, 1});
        
        for(String route : routes){
            char direction = route.charAt(0);
            int count = route.charAt(2) - '0';
            
            int[] directionXY = coord.get(direction);
            
            //위치
            int dx = directionXY[0];
            int dy = directionXY[1];
            
            
            //현재 위치
            int cx = answer[0];
            int cy = answer[1];
            
            boolean visited = true;
            
            for(int i=0; i<count; i++){
                cx += dx;
                cy += dy;
                
                //공원 경계 벗어나거나, 장애물 X에 닿으면 종료
                if(cx < 0 || cy < 0 || cx >park.length-1 || cy >park[0].length()-1){
                    visited = false;
                    break;
                }
                
                if( park[cx].charAt(cy) == 'X'){
                    visited = true;
                    break;
                }
                
                if(visited){
                    answer[0] = cx;
                    answer[1] = cy;
                }
            }   
        }
        return answer;
    }
    
    //별도 메서드 : 시작 위치를 찾는 메서드 구현(answer 배열에 넣을 것)
    public int[] getAnswer(String[] park){
        for(int i=0; i<park.length; i++){
            for(int j=0; j<park[0].length(); j++){
                char current = park[i].charAt(j);
                
                if('S' == current){
                    return new int[]{i, j};
                }
            }
        }
        return new int[]{0,0};
    }
}


오답체크


  • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
//before
int[] answer = {};
//after
int[] answer = getAnswer(park);

  • 테스트 미통과 문제

    -> 이중 for문 중, 바깥의 for문을 수행할 시에 visited가 돌아가야 하는데, 안쪽 for문에서 반복적으로 visited가 돌아가도록 한 것이 원인.
//before
//공원 경계 벗어나거나, 장애물 X에 닿으면 종료
if(cx < 0 || cy < 0 || cx >park.length-1 || cy >park[0].length()-1){
	visited = false;
	break;
}
if( park[cx].charAt(cy) == 'X'){
	visited = true;
	break;
}
                
if(visited){
	answer[0] = cx;
	answer[1] = cy;
}
//after
for(String route : routes){
	char direction = route.charAt(0);
    int count = route.charAt(2) - '0';
    
    int[] directionXY = coord.get(direction);
            
	//위치
    int dx = directionXY[0];
    int dy = directionXY[1];

   //현재 위치
	int cx = answer[0];
	int cy = answer[1];
            
	boolean visited = true;
            
	for(int i=0; i<count; i++){
		cx += dx;
		cy += dy;
                
		//공원 경계 벗어나거나, 장애물 X에 닿으면 종료
        if(cx < 0 || cy < 0 || cx >park.length-1 || cy >park[0].length()-1){
		visited = false;
		break;
		}
                
		if( park[cx].charAt(cy) == 'X'){
			visited = false;
			break;
		}
	}

	if(visited){
		answer[0] = cx;
		answer[1] = cy;
	}   
}
return answer;


최종 풀이


풀이 시간 : 47분(첫 풀이 시간 포함)

  1. 이동 방향(N, S, W, E) HashMap으로 설정
  2. routes 순회
    • 경로 이동 시도
    • 공원 경계 벗어나거나, 장애물 X에 닿으면 종료
  3. 최종 위치 반환
  4. 별도 메서드 : 시작 위치를 찾는 메서드 구현(answer 배열에 넣을 것)
import java.util.*;

class Solution {
    public int[] solution(String[] park, String[] routes) {
        
        //getAnswer 적용해야 할 듯..?
        //int[] answer = {};
        int[] answer = getAnswer(park);
        
        Map<Character, int[]> coord = new HashMap<>();

        coord.put('N', new int[]{-1, 0});
        coord.put('S', new int[]{1, 0});
        coord.put('W', new int[]{0, -1});
        coord.put('E', new int[]{0, 1});
        
        for(String route : routes){
            char direction = route.charAt(0);
            int count = route.charAt(2) - '0';
            
            int[] directionXY = coord.get(direction);
            
            //위치
            int dx = directionXY[0];
            int dy = directionXY[1];
            
            
            //현재 위치
            int cx = answer[0];
            int cy = answer[1];
            
            boolean visited = true;
            
            for(int i=0; i<count; i++){
                cx += dx;
                cy += dy;
                
                //공원 경계 벗어나거나, 장애물 X에 닿으면 종료
                if(cx < 0 || cy < 0 || cx >park.length-1 || cy >park[0].length()-1){
                    visited = false;
                    break;
                }
                
                if( park[cx].charAt(cy) == 'X'){
                    visited = false;
                    break;
                }
            }
                
            if(visited){
                answer[0] = cx;
                answer[1] = cy;
            }   
        }
        return answer;
    }
    
    //별도 메서드 : 시작 위치를 찾는 메서드 구현(answer 배열에 넣을 것)
    public int[] getAnswer(String[] park){
        for(int i=0; i<park.length; i++){
            for(int j=0; j<park[0].length(); j++){
                char current = park[i].charAt(j);
                
                if('S' == current){
                    return new int[]{i, j};
                }
            }
        }
        return new int[]{0,0};
    }
}


결과


업로드중..

profile
언젠가 내 코드로 세상에 기여할 수 있도록, BE 개발 기록 노트☘️

0개의 댓글