본문 바로가기
개인 공부/TIL

[ TIL - PGS ] 99클럽 코테 스터디 33일차 TIL + 오늘의 학습 가이드

by 킴도비 2024. 8. 24.

💡 오늘의 학습 키워드

  • 깊이/너비 우선 탐색(DFS/BFS)

 

✅ 오늘 공부한 내용

  • 오늘의 프로그래머스 문제! 리코챗 로봇
 

프로그래머스

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

programmers.co.kr

 

 

👀 오늘의 회고

🔥 어떤 시도를 했는가?

  • 오늘의 풀이
import java.util.*;

class Solution {
    // 네 방향 상, 하, 좌, 우
    private static final int[] dx = {-1, 1, 0, 0};
    private static final int[] dy = {0, 0, -1, 1};

    public int solution(String[] board) {
        int n = board.length;
        int m = board[0].length();
        int startX = 0, startY = 0;
        int goalX = 0, goalY = 0;

        // 로봇과 목표 지점 위치 찾기
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (board[i].charAt(j) == 'R') {
                    startX = i;
                    startY = j;
                } else if (board[i].charAt(j) == 'G') {
                    goalX = i;
                    goalY = j;
                }
            }
        }

        // BFS를 위한 큐와 방문 배열
        Queue<int[]> queue = new LinkedList<>();
        boolean[][] visited = new boolean[n][m];
        
        // 초기 위치 큐에 삽입 및 방문 처리
        queue.add(new int[] {startX, startY, 0}); // {x좌표, y좌표, 이동 횟수}
        visited[startX][startY] = true;

        // BFS 탐색
        while (!queue.isEmpty()) {
            int[] current = queue.poll();
            int x = current[0];
            int y = current[1];
            int moves = current[2];

            // 목표 지점에 도달했을 경우 이동 횟수 반환
            if (x == goalX && y == goalY) {
                return moves;
            }

            // 네 방향으로 이동
            for (int dir = 0; dir < 4; dir++) {
                int nx = x;
                int ny = y;

                // 해당 방향으로 이동 가능한 만큼 이동
                while (true) {
                    int tx = nx + dx[dir];
                    int ty = ny + dy[dir];

                    if (tx < 0 || tx >= n || ty < 0 || ty >= m || board[tx].charAt(ty) == 'D') {
                        break; // 범위 밖이거나 장애물에 닿으면 이동 멈춤
                    }
                    
                    nx = tx;
                    ny = ty;
                }

                // 새로운 위치를 큐에 넣고 방문 처리
                if (!visited[nx][ny]) {
                    queue.add(new int[] {nx, ny, moves + 1});
                    visited[nx][ny] = true;
                }
            }
        }

        // 목표 지점에 도달할 수 없을 경우
        return -1;
    }
}

 

👩‍💻 내일은 무엇을 학습할 것인가?

  • 항해99 문제 풀기
  • 책 3권 다 읽기