본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / 공원 산책 / JAVA]

by KDW999 2023. 3. 27.

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 접근

처음에 park를 2차원 배열로 바꿔서 풀었는데 런타임 에러가 뜨더라

다른 사람 풀이를 보니 나랑 같은 방법에 park를 그대로 사용하였더라

내가 2차원 배열로 바꾼게 문제 같아서 park를 그대로 사용해서 풀이하니 맞았다.

 

ㅡ 시작 위치를 파악하고 동서남북으로 가는 방향마다 공원 이탈과 이동 경로에 장애물이 있는지 다 만들어서 풀어주었다.

class Solution {
   public int[] solution(String[] park, String[] routes) {
		
		// 시작 위치
		int[] answer = 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') {
					answer[0] = i;
					answer[1] = j;
					System.out.println(answer[0] + " / " + answer[1]);
				}
			}
		}
		
		
		for(int i=0; i<routes.length; i++) { // 출발
			
			if(routes[i].charAt(0) == 'E') { // 동쪽
				int move = Integer.valueOf(routes[i].charAt(2)-48);
				System.out.println("이동 거리 : "+ move);
				
				boolean flag = false;
				
				if(answer[1] + move >= park[answer[0]].length()) continue; // 공원 이탈
				for(int j=1; j<=move; j++) { // 장애물 검사
					if(park[answer[0]].charAt(answer[1]+j) == 'X') {
						flag = true;
						break;
					}
				}
				if(flag == true) continue;
				answer[1] += move;
				System.out.println("E : 현재 위치 "+ answer[0] + " / " + answer[1]);
			}
			
			else if(routes[i].charAt(0) == 'W') { // 서쪽
				int move = Integer.valueOf(routes[i].charAt(2)-48);
				System.out.println("이동 거리 : "+ move);
				
				boolean flag = false;
				
				if(answer[1] - move < 0) continue; // 공원 이탈
				for(int j=1; j<=move; j++) { // 장애물 검사
					if(park[answer[0]].charAt(answer[1]-j) == 'X') {
						flag = true;
						break;
					}
				}
				if(flag == true) continue;
				answer[1] -= move;
				System.out.println("W : 현재 위치 "+ answer[0] + " / " + answer[1]);
			}
			
			else if(routes[i].charAt(0) == 'S') { // 남쪽
				int move = Integer.valueOf(routes[i].charAt(2)-48);
				System.out.println("이동 거리 : "+ move);
				
				boolean flag = false;
				
				if(answer[0] + move >= park.length) continue; // 공원 이탈
				for(int j=1; j<=move; j++) { // 장애물 검사
					if(park[answer[0]+j].charAt(answer[1]) == 'X') {
						flag = true;
						break;
					}
				}
				if(flag == true) continue;
				answer[0] += move;
				System.out.println("S : 현재 위치 "+ answer[0] + " / " + answer[1]);
			}
			
			else if(routes[i].charAt(0) == 'N') { // 북쪽
				int move = Integer.valueOf(routes[i].charAt(2)-48);
				System.out.println("이동 거리 : "+ move);
				
				boolean flag = false;
				
				if(answer[0] - move < 0) continue; // 공원 이탈
				for(int j=1; j<=move; j++) { // 장애물 검사
					if(park[answer[0]-j].charAt(answer[1]) == 'X') {
						flag = true;
						break;
					}
				}
				if(flag == true) continue;
				answer[0] -= move;
				System.out.println("N : 현재 위치 "+ answer[0] + " / " + answer[1]);
			}
		}
		
		return answer;
	}
}

댓글