코딩 테스트(Coding Test)/프로그래머스
[프로그래머스] 공원 산책
배씌
2023. 5. 28. 19:02
코딩테스트 연습 - 공원 산책 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 아이디어
처음에는 boolean 타입의 2차원 배열 형태로 문제를 접근했으나, 이전 문제에서 시간초과에 한번 데인적이 있기 때문에 이중 루프를 이용하면 또다시 시간 초과가 뜰 것이라 생각하여 기존의 입력받은 문자열 배열 형태에서 값에 접근하고자 하였다.
우선 이 문제의 핵심 key 는 시작위치 "S" 라 생각하였고, 이를 토대로 route 명령어를 수행하며 true, false 유무를 따지면 되겠다 생각하였다. route 명령어 4가지는 각각
N : 북쪽으로 주어진 칸만큼 이동 -> park[(y좌표+n)]
S : 남쪽으로 주어진 칸만큼 이동 -> park[(y좌표-n)]
W : 서쪽으로 주어진 칸만큼 이동 -> park[(y좌표 고정)].charAt(i-n)
E : 동쪽으로 주어진 칸만큼 이동 -> park[(y좌표 고정)].charAt(i+n)
으로 생각하여 접근했다.
이를 통해 각각의 메소드 4가지를 만들어 이동가능한지 체크하였고, route 명령어에 맞는 메소드를 실행하도록 구현했다.
명령어가 N일때의 경우만 예시로 들어보겠다.
public static boolean checkNorth(int startX, int startY, String[] park, int n){
if((startY - n) < 0)
return false;
for(int i=startY; i>=(startY-n); i--)
if(park[i].charAt(startX) == 'X')
return false;
return true;
}
N 명령어를 실행 할 수 있는 지 확인 후,
case 'N':
if(checkNorth(startX, startY, park, n))
startY -= n;
break;
이와 같이 Y 좌표에 n만큼 빼주는 형태로 구현하였다.
2. 코드
class Solution {
public static boolean checkNorth(int startX, int startY, String[] park, int n){
if((startY - n) < 0)
return false;
for(int i=startY; i>=(startY-n); i--)
if(park[i].charAt(startX) == 'X')
return false;
return true;
}
public static boolean checkSouth(int startX, int startY, int h, String[] park, int n){
if((startY + n) > h-1)
return false;
for(int i=startY; i<=(startY+n); i++)
if(park[i].charAt(startX) == 'X')
return false;
return true;
}
public static boolean checkWest(int start, String s, int n){
if((start - n) < 0)
return false;
for(int i=start; i>=(start-n); i--){
if(s.charAt(i) == 'X')
return false;
}
return true;
}
public static boolean checkEast(int start, int w, String s, int n){
if((start + n) > w-1)
return false;
for(int i=start; i<=(start+n); i++)
if(s.charAt(i) == 'X')
return false;
return true;
}
public int[] solution(String[] park, String[] routes) {
int w = park[0].length();
int h = park.length;
int startX = 0, startY = 0;
for(int i=0; i<h; i++){
if(park[i].contains("S")){
startY = i;
break;
}
}
for(int i=0; i<w; i++){
if(park[startY].charAt(i) == 'S'){
startX = i;
break;
}
}
for(int i=0; i<routes.length; i++){
char c = routes[i].charAt(0);
int n = routes[i].charAt(2)-48;
switch(c){
case 'N':
if(checkNorth(startX, startY, park, n))
startY -= n;
break;
case 'S':
if(checkSouth(startX, startY, h, park, n))
startY += n;
break;
case 'W':
if(checkWest(startX, park[startY], n))
startX -= n;
break;
case 'E':
if(checkEast(startX, w, park[startY], n))
startX += n;
break;
}
}
int[] result = new int[2];
result[0] = startY;
result[1] = startX;
return result;
}
}