반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
서론
상하좌우로 가긴 하는데, 맨 끝까지 간다는 것만 빼면 흔한 BFS 문제입니다.
뻘짓을 제외하면
늘 BFS를 풀던대로 풀었습니다.
풀이
- 들어온 입력(
board)을 재처리 해줍니다.
입력에서 'G'를 '.' 으로 재처리해주고, 따로 저장해줍니다.
그리고 'R'은Queue에 넣어줍니다(시작지점이기 때문에 재처리 불필요) - BFS를 돌려줍니다. 그리고
vst배열에 이동거리를 저장해줍니다.
다음으로 갈 지점(nx, ny)을 정할 때는 반복문으로 1씩 더해줬습니다.
보드의 크기가 100 이하이기 때문에 복잡한 계산 없이 간단하게 반복문으로 처리했습니다. vst[end.x][end.y]를 반환합니다. 끝!
풀이 코드
import java.util.*;
class Solution {
static int[] dx = {0, 1, 0, -1};
static int[] dy = {1, 0, -1, 0};
static class Point {
int x, y;
Point (int x, int y) { this.x = x; this.y = y; }
@Override
public boolean equals(Object o) {
if (o == null || this.getClass() != o.getClass()) return false;
Point point = (Point) o;
return this.x == point.x && this.y == point.y;
}
}
public int solution(String[] board) {
int n = board.length;
int m = board[0].length();
Queue<Point> que = new LinkedList<>();
Point end = new Point(0, 0);
int[][] vst = new int[n][m];
for (int i = 0; i < n; i++) Arrays.fill(vst[i], -1);
for (int i = 0; i < board.length; i++) {
StringBuilder builder = new StringBuilder(board[i]);
for (int j = 0; j < board[i].length(); j++) {
if (board[i].charAt(j) == 'G') {
builder.setCharAt(j, '.');
end = new Point(i, j);
}
if (board[i].charAt(j) == 'R') {
que.add(new Point(i, j));
vst[i][j] = 0;
}
board[i] = builder.toString();
}
}
while (!que.isEmpty()) {
Point cur = que.poll();
if (cur.equals(end)) break;
for (int d = 0 ; d < 4; d++) {
int nx = cur.x;
int ny = cur.y;
while (true) {
nx += dx[d];
ny += dy[d];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) break;
if (board[nx].charAt(ny) == 'D') break;
}
nx -= dx[d];
ny -= dy[d];
if (vst[nx][ny] > -1) continue;
que.add(new Point(nx, ny));
vst[nx][ny] = vst[cur.x][cur.y] + 1;
}
}
int answer = vst[end.x][end.y];
return answer;
}
}
배운 점
String의charAt()메소드 사용법과StringBuilder의 사용법을 복습할 수 있었습니다.
C++ 언어에서는 문자열의 캐릭터(char)에 접근할 때str[1]과 같이 접근이 가능했는데,
Java 언어에서는String이 객체여서charAt(1)과 같이 메소드를 사용해서 접근이 가능했습니다.
또, 캐릭터를 함부로 변경이 불가능했기에StringBuilder를 사용해서 수정해야한다는 점도 다시 상기하게 되었습니다.
아래는String과 StringBuilder의 예시입니다.
String a = "hahaha";
System.out.println(a.charAt(1)); // 'o'
StringBuilder builder = new Stringbuilder(a);
builder.setCharAt(1, 'o');
a = builder.toString();
System.out.println(a); // "hohaha"
equals메소드 오버라이딩 시 주의할 점
평소에는 오버라이딩할 때 그냥this와 파라미터의 멤버변수만을 비교했는데,
인텔리제이의 자동 생성 기능이 있어서 이 기능으로 equals를 만들고 나니 객체 null체크 코드가 있는 것을 확인할 수 있었습니다.
앞으로equals메소드를 오버라이딩할 때는 null체크 조건문을 꼭 넣어주는 습관도 들여야겠다고 생각했습니다.
아래는 위 풀이 코드의Point클래스의equals메소드 부분입니다.
@Override
public boolean equals(Object o) {
if (o == null || this.getClass() != o.getClass()) return false;
Point point = (Point) o;
return this.x == point.x && this.y == point.y;
}
부족한 글 봐주셔서 감사합니다. 🙇
풀이와 코드에 부족한 점이나 추가하면 좋을 점이 있으면 댓글 주세요!
'Study > 알고리즘 풀이' 카테고리의 다른 글
| [백준] 1504번: 특정한 최단 경로 (C++) (0) | 2023.08.02 |
|---|---|
| [백준] 2096번: 내려가기 (C++, JAVA) (0) | 2023.08.01 |
| [프로그래머스] 소수 찾기 (java 풀이) (0) | 2023.07.26 |
| [프로그래머스] 혼자서 하는 틱택토 (java 풀이) + [백준] 틱택토(BOJ 7682) (0) | 2023.07.24 |
| [프로그래머스] 과제 진행하기 (Java 풀이) (0) | 2023.07.20 |