[Programmers] 리코쳇 로봇 (JAVA)

2024. 5. 12. 20:46·코테/Algorithm
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

 

구현+BFS 문제 .. 나는 참 구현문제가 힘들다🥹

일단 이번 문제를 풀 때 내가 간과한 부분이 있다면 큐의 작동원리인 것 같다.

 

처음 문제를 보고 전체를 방문하면서 큐에 넣고 빼면서 하나하나 체크를 해줬는데, 그렇게 풀었더니 테케 1, 7, 9, 25에서 실패가 나왔다.

생각해보니 그렇게 문제를 해결하다보면, 더 짧게 방문할 수 있는 분기B가 있는데도 이미 이전 A가 방문하고 지나쳐버렸기 때문에 더 짧게 도달하지 못하는 경우가 생긴다.

 

그리고, 끝까지 하나하나 체크하면서 너 끝이니? 너 장애물이니? 체크해주면 터지지 않을까 했는데,

최대 100x100이기도 하고, 중간중간 장애물이 있기 때문에 while문을 돌면서 벽에 부딪치거나 map밖으로 나가면!

이전 위치의 visited[n.x][n.y]에 저장해놓은 내가 이동한 횟수에 +1을 해줘서 문제를 풀었다.

 

한번 꼬여서 고생했지만 풀고나니까 굉장히 후련한 문제 ~!

구현 문제를 열심히 더 풀어보자 !

 

 

전체코드
import java.io.*;
import java.util.*;

class Solution {
    //상좌하우 0 1 2 3
    static int goX[] = {-1, 0, 1, 0};
    static int goY[] = {0, -1, 0, 1};
    static int N;
    static int M;
    static int visited[][];
    static char map[][];
    static int ans;
    static boolean row[];
    static class Node{
        int x;
        int y;
        Node(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
    public int solution(String[] board) {
        map = new char[board.length][board[0].length()];
        for(int i=0; i<board.length; i++){
            map[i] = board[i].toCharArray();
        }
        N = board.length;
        M = map[0].length;
        visited = new int[N][M];
        row = new boolean[4];
        
        for(int i=0; i<N; i++){
            for(int j=0; j<M; j++){
                if(map[i][j] == 'R'){
                    Robot(i, j);
                    break;
                }
            }
        }
        
        if(ans == 0){
            ans = -1;
        }
        return ans;
    }
    static void Robot(int x, int y){
        Queue<Node> queue = new LinkedList<>();
        queue.offer(new Node(x, y));
        visited[x][y] = 1;
        
        while(!queue.isEmpty()){
            Node n = queue.poll();
            
            int newX = n.x;
            int newY = n.y;
            
            //n의 가야하는 방향을 지정
            for(int i=0; i<4; i++){
                int nX = newX + goX[i];
                int nY = newY + goY[i]; 

                if(nX < 0 || nX >= N || nY < 0 || nY >= M || map[nX][nY] == 'D'){
                    if(row[i]){
                        row[i] = false;
                    }
                    continue;
                }
                
                row[i] = true; 
            }
            
            for(int i=0; i<4; i++){
                int nX = newX;
                int nY = newY;
                if(row[i]){
                    while(true){
                        nX += goX[i];
                        nY += goY[i];

                        //다음이 밖으로 나갔을 때, 벽에 부딪혔을 때는 멈춰!
                        if(nX < 0 || nX >= N || nY < 0 || nY >= M 
                           || map[nX][nY] == 'D'){
                            nX -= goX[i];
                            nY -= goY[i];
                            break;
                        }
                    }

                    //도착지네?
                    if(map[nX][nY] == 'G'){
                        visited[nX][nY] = visited[newX][newY] + 1;
                        ans = visited[nX][nY]-1;
                        return;
                    }
                    
                    if(visited[nX][nY] != 0){
                        continue;
                    }
                    
                    visited[nX][nY] = visited[newX][newY]+1;
                    queue.offer(new Node(nX, nY));
                }else{
                    continue;
                }
            }
        }
    }
}
728x90

'코테 > Algorithm' 카테고리의 다른 글

[BOJ] 2578: 빙고 (JAVA)  (0) 2024.05.14
[Programmers] 방문 길이 (JAVA)  (0) 2024.05.12
[BOJ] 2167: 2차원 배열의 합 (JAVA)  (0) 2024.05.07
[BOJ] 2839: 설탕배달 (JAVA)  (0) 2024.05.05
[BOJ] 1915: 가장 큰 정사각형 (JAVA)  (0) 2024.05.04
'코테/Algorithm' 카테고리의 다른 글
  • [BOJ] 2578: 빙고 (JAVA)
  • [Programmers] 방문 길이 (JAVA)
  • [BOJ] 2167: 2차원 배열의 합 (JAVA)
  • [BOJ] 2839: 설탕배달 (JAVA)
DROPDEW
DROPDEW
💻 Developer | 기록하지 않으면 존재하지 않는다
  • DROPDEW
    제 2장 1막
    DROPDEW
  • 전체
    오늘
    어제
    • categories (408) N
      • App/Android (1)
      • BE (41) N
        • HTTP 웹 기본 지식 (8)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (12)
        • 스프링부트와 JPA 활용 (8) N
        • 스프링부트 시큐리티 & JWT (0)
        • PHP (6)
      • FE·Client (23)
        • HTML (1)
        • React (19)
        • Unity (1)
      • Data (12)
        • AI (4)
        • Bigdata (6)
        • Database (1)
        • 빅데이터분석기사 (0)
      • Infra (0)
      • CS (7)
        • CS 면접 준비 (3)
      • 취준 (13)
        • 자격증·인턴·교육 (4)
        • 인적성·NCS (6)
        • 코테·필기·면접 후기 (3)
      • 코테 (270) N
        • Algorithm (222) N
        • SQL (35)
        • 정리 (13)
      • 인사이트 (27)
        • 금융경제뉴스 (7)
        • 금융용어·지식 (2)
        • 북마크 (7)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    그래프이론
    너비우선탐색
    누적합
    시뮬레이션
    매개변수탐색
    구현
    티스토리챌린지
    다이나믹프로그래밍
    최단경로
    그래프탐색
    그리디알고리즘
    자료구조
    수학
    정렬
    문자열
    오블완
    투포인터
    이분탐색
    브루트포스 알고리즘
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
DROPDEW
[Programmers] 리코쳇 로봇 (JAVA)
상단으로

티스토리툴바