반응형
프로그래머스 lv2 리코쳇 로봇을 풀어보았다.
https://school.programmers.co.kr/learn/courses/30/lessons/169199?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
걸린 시간: 35분 - 문제를 제대로 이해하지 못한 죄..
문제 설명
문제는 처음에 봤을 때 간단했다. 시작 위치에서 `G` 목표지점으로 이동, 상, 하, 좌, 우 단어만 보고 기본 bfs 문제겠구나 싶어서 거의 기계처럼 코드를 짜내려 갔다.
ide 없이 프로그래머스 자체에서 코드 짜는 연습을 하고 있었기에 간단한 에러들을 수정했더니 테스트를 통과하지 못했다.
다시 문제를 읽어보니
상, 하, 좌, 우 4방향 중 하나를 선택해서 게임판 위의 장애물이나 맨 끝에 부딪힐 때까지 미끄러져 이동하는 것을 한 번의 이동
한 번의 이동이 상, 하, 좌, 우로 미끄러져 멈춰질 때까지였다.. 따라서 나는 코드를 수정해
- 현재 위치가 맵의 범위를 벗어나면 종료
- 현재 위치가 벽이면 종료
위의 조건으로 while문을 실행했고, while을 벗어난 후, 이동 방향으로 -1을 해주면 벽이거나 맨 끝 위치로 지정된다.
- visited를 이용해 이 위치에서 시작되는 상, 하, 좌, 우를 반복하지 않게 설정
전체 코드
import java.util.*;
class Solution {
class Point{
int row,col,cnt;
public Point(int r, int c, int cnt){
this.row=r; this.col=c; this.cnt=cnt;
}
}
public static int[][] direction = {{1,0},{-1,0},{0,1},{0,-1}};
public static int[][] map, visited;
public static int row, col;
public static Point init;
public int solution(String[] board) {
int answer = 0;
row = board.length;
col = board[0].length();
map = new int[row][col];
visited = new int[row][col];
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(board[i].charAt(j) == 'D') map[i][j] = -1;
else if(board[i].charAt(j) == 'R') init = new Point(i,j,0);
else if(board[i].charAt(j) == 'G') map[i][j] = 1;
}
}
return bfs(init);
}
public int bfs(Point start){
Queue<Point> queue = new LinkedList<>();
queue.offer(start);
while(!queue.isEmpty()){
Point p = queue.poll();
if(map[p.row][p.col] == 1) return p.cnt;
visited[p.row][p.col] = 1;
for(int i=0; i<direction.length; i++){
int nextR = p.row + direction[i][0];
int nextC = p.col + direction[i][1];
while(checkPoint(nextR, nextC) && map[nextR][nextC] != -1){
nextR += direction[i][0];
nextC += direction[i][1];
}
int r = nextR - direction[i][0];
int c = nextC - direction[i][1];
if(visited[r][c] == 0){
queue.offer(new Point(r, c, p.cnt+1));
}
}
}
return -1;
}
public boolean checkPoint(int r, int c){
return (r < 0 || r >= row || c < 0 || c >= col)? false:true;
}
}
문제의 조건이 최대 100x100이기 때문에 신경 쓰지 않고 bfs를 진행하였고, 코드가 너무 긴 것 같아 다른 사람의 풀이를 봤더니 별반 차이가 없거나 이해하기 더 어려워 수정하지 않았다.
반응형
'Algorithm-Java' 카테고리의 다른 글
프로그래머스 - 연속 펄스 부분 수열의 합 + 구간 합 (1) | 2023.03.19 |
---|---|
프로그래머스 - 양궁대회 (0) | 2023.03.18 |
자료구조 - 해쉬 테이블 (0) | 2023.03.09 |
프로그래머스 - 택배 배달과 수거하기 (0) | 2023.03.06 |
프로그래머스 - 이모티콘 할인행사 (0) | 2023.03.05 |