-
프로그래머스 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)과 같다면 반복을 종료하고 리턴한다.
소스 코드 :