연습문제 > 공원 산책
https://school.programmers.co.kr/learn/courses/30/lessons/172928
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
S가 시작지점일 것
X는 장애물
O는 이동가능 한 곳
E스트 = 동쪽
Wㅞ스트 = 서쪽
Nㅗ스 = 북쪽
Sㅏ우스 = 남쪽
시작 지점을 초기화하고 데이터를 좀 더 보기 편하게 console.log
시작 지점을 캐치하려고 하다보니
신기하게도 데이터 타입이 편하게
1차원 배열의 i 위치가 (3개면 0, 1, 2순) Y좌표가 되고
2차원 배열의 i 위치가 (3개면 0, 1, 2 순) X 좌표
SOO
OOO
OOO
시작 지점이 첫 줄 SOO 에 있다면 0,0 이고 기댓값이 0, 1이면 이동 한 후의 위치는 OSO 에 있다는 것
OSO
OOO
OXO
OOO
이라면 시작 지점은 0, 1 이다 0 = 배열 세로 줄 중 0번째 1 = 가로 줄 중 1번째
시작지점 구하기 완료
이동 가능여부 판단해서 조건부 실행시키고 실행 시마다 위치 변경해서 마지막 위치 result 리턴해주면 된다
우선 이동 가능한지 여부 중
- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
의 경우는 시작지점에서 배열의 전체 범위를 구해서 벗어나는지 판단
- N : 북쪽으로 주어진 칸만큼 이동합니다.
- S : 남쪽으로 주어진 칸만큼 이동합니다.
- W : 서쪽으로 주어진 칸만큼 이동합니다.
- E : 동쪽으로 주어진 칸만큼 이동합니다.
N과 S 일 경우는 Y축 좌표를 검사
W와 E일 때는 X축 좌표를 검사
이런 조건문으로 구할 수 있지 않을까
이제 저기에 장애물 조건문을 추가하면 완성일 듯
- 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
이제 중간에 X가 있는지 검사하기
움직이려는 라인에 X가 있다면 그 X만큼 높이나 길이가 빠지게 되면 된다
근데 이걸 어찌하지
일단 좀 가독성 있게 변경
설마 사이사이에 for 문을 한번 더 써야하나 고민했는데...
세상에
GPT패배
뭔가 좀 더 쉽게 접근하고 쉽게 푸는법이 있지 않을까
function solution(park, routes) {
let result = [0, 0];
// 출발점(S) 위치 찾기
for (let i = 0; i < park.length; i++) {
for (let j = 0; j < park[i].length; j++) {
if (park[i][j] === "S") {
result = [i, j];
}
}
}
// 방향별 이동을 위한 델타 값
const directions = {
N: [-1, 0],
S: [1, 0],
W: [0, -1],
E: [0, 1]
};
// 주어진 방향으로 이동 가능한지 확인하는 함수
function canMove(position, direction, moveNum) {
let [x, y] = position;
let [dx, dy] = directions[direction];
for (let i = 1; i <= moveNum; i++) {
x += dx;
y += dy;
if (x < 0 || x >= park.length || y < 0 || y >= park[0].length || park[x][y] === 'X') {
return false;
}
}
return true;
}
// 경로 따라 이동
for (let i = 0; i < routes.length; i++) {
const [direction, moveNumStr] = routes[i].split(" ");
const moveNum = Number(moveNumStr);
if (canMove(result, direction, moveNum)) {
result[0] += directions[direction][0] * moveNum;
result[1] += directions[direction][1] * moveNum;
}
}
return result;
}