728x90
코드 힌트
- 목표:
- 주어진 숫자 x에서 시작해 목표 숫자 y에 도달하는 최소 연산 횟수를 구합니다.
- 사용 가능한 연산은 n을 더하기, 2를 곱하기, 3을 곱하기입니다.
- BFS (너비 우선 탐색):
- BFS를 사용해 최단 경로를 찾습니다.
- BFS는 주어진 상태에서 가능한 모든 다음 상태를 큐에 추가하고, 하나씩 처리하면서 목표 상태에 도달하는지를 확인합니다.
- 방문 체크:
- 아마 대부분의 사람들이 시간초과의 이유로 찾으셨을거라고 생각합니다.
- 이미 방문한 숫자는 최소 횟수가 아니므로 visit 배열을 사용하여 이미 방문한 숫자는 다시 방문하지 않도록 visited 배열을 사용합니다.
- 종료 조건:
- 목표 숫자 y에 도달하면 그때까지의 연산 횟수를 반환합니다.
- 큐가 비었음에도 목표에 도달하지 못했다면 -1을 반환해 불가능함을 나타냅니다.
정답은 더보기 클릭
더보기
import java.util.*;
class Solution {
public int solution(int x, int y, int n) {
// BFS를 이용하여 x에서 y로 가는 최소 연산 횟수를 찾음
return bfs(x, y, n);
}
int bfs(int x, int y, int n) {
// BFS 탐색을 위한 큐, 초기 상태는 {x, 0} (현재 숫자, 연산 횟수)
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{x, 0});
// 방문 체크 배열, 숫자 y까지 방문 여부를 기록
boolean[] visited = new boolean[y+1];
while (!q.isEmpty()) {
int[] tmpArr = q.poll(); // 현재 상태를 큐에서 꺼냄
int currNum = tmpArr[0]; // 현재 숫자
int count = tmpArr[1]; // 연산 횟수
// 현재 숫자가 목표 숫자 y와 같다면, 연산 횟수를 반환
if (currNum == y) return count;
// 가능한 연산을 통해 새로운 숫자를 계산하고 큐에 추가
if (currNum + n <= y && !visited[currNum+n]) {
q.add(new int[] {currNum+n, count+1});
visited[currNum+n] = true; // 방문 체크
}
if (currNum * 2 <= y && !visited[currNum*2]) {
q.add(new int[] {currNum*2, count+1});
visited[currNum*2] = true; // 방문 체크
}
if (currNum * 3 <= y && !visited[currNum*3]) {
q.add(new int[] {currNum*3, count+1});
visited[currNum*3] = true; // 방문 체크
}
}
// 큐가 비었는데도 목표 숫자 y에 도달하지 못한 경우 -1 반환
return -1;
}
}
728x90
'프로그래머스(Java) > Level 2' 카테고리의 다른 글
[프로그래머스] 2 x n 타일링 (0) | 2024.09.03 |
---|---|
[프로그래머스] [1차] 프렌즈4블록 (1) | 2024.09.03 |
[프로그래머스] 오픈채팅방 (0) | 2024.08.23 |
[프로그래머스] 택배상자 (0) | 2024.08.23 |
[프로그래머스] 주차 요금 계산 (0) | 2024.08.21 |