ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 2020블라인드 : 블록 이동하기-Java
    문제풀이/Programmers 2020. 12. 19. 20:52

    문제 링크입니다.

    programmers.co.kr/learn/courses/30/lessons/60063

     

    코딩테스트 연습 - 블록 이동하기

    [[0, 0, 0, 1, 1],[0, 0, 0, 1, 0],[0, 1, 0, 1, 1],[1, 1, 0, 0, 1],[0, 0, 0, 0, 0]] 7

    programmers.co.kr

    문제 분석 : 

    상, 하, 좌, 우 그리고 회전이 가능한 로봇을 (1,1) 위치에서 (N,N)위치로 이동하는 문제로

    로봇의 현재 위치에서의 가능한 모든 이동을 할 수 있도록 코드를 작성했다.

    로봇은 가로, 세로 형태 중 한가지로 존재하기 때문에 가로형태일 때와 세로형태일 때를 나누어 명령을 수행하도록 구현했고 로봇이 차지하는 두 칸중 한 칸이라도 (N,N)에 도착하면 되는 조건이 존재하지만 두 가지 칸 모두를 계속 검사하기엔  효율적이지 못하니 로봇이 가로 형태라면 오른쪽 위치, 세로 형태라면 아래쪽의 위치만 가지고 판단했다.

    주의해야 할 점은 현재 위치에서의 가능한 이동과 회전할 때의 조건이다.

    로봇이 (1,2)(1,3) 두 칸을 차지하며 가로로 놓여있을 때 좌측으로 이동한다면 현재 위치인 (1,2)에서 y축으로

    2칸이 떨어진 (1,1)을 보아야 하고, 세로로 놓여있을 때 상단으로 이동할 때도 주의해서 범위를 정해야 했다.

    로봇이 같은 위치를 계속 탐색할 수 있기에 boolean형 삼차원 배열visit[][][]을 선언해 같은 좌표에 같은 형태(가로 0, 세로 1)로 방문한 적이 있다면 방문하지 않도록 작성했다.

     

     

     

    문제 접근 :

    1. 로봇이 차지하고 있는 위치 중 하나의 위치를 기준으로 잡고 Queue에 삽입한다.

    2. 현재 위치에서 가능한 모든 이동을 수행한다.

       2.1. 다음 위치에 같은 모양으로 방문한 적이 있다면 Queue에서 삭제.

       2.2. 이동할 수 없는 곳이라면 Queue에서 삭제.

    3. Queue에서 꺼낸 좌표의 값이 (N,N)과 같다면 반복을 종료하고 리턴한다.

     

    소스 코드 :

    github.com/Kim-SiHwan/Algorithm/blob/main/Programmers/%EB%B8%94%EB%A1%9D%20%EC%9D%B4%EB%8F%99%ED%95%98%EA%B8%B0.java

    댓글

Designed by Tistory.