algorithm/문제풀이

연습문제 > 공원 산책

yongfront 2024. 6. 19. 17:20
반응형
SMALL

 

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;
}

 

728x90
반응형
LIST