Question
https://school.programmers.co.kr/learn/courses/30/lessons/154538
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
Algorithm
- dp 배열 정의
- dp[i] = x에서 i로 변환하는 최소 연산 횟수
- 초기 상태 설정
- dp[x] = 0 (시작 숫자라서 연산 횟수 0)
- 나머지는 아직 도달하지 않았으므로 0으로 초기화
- x부터 y까지 순차적으로 탐색
- 현재 위치 i가 시작점이 아니고 dp[i] == 0이면 → 도달 불가능하므로 -1 표시 후 건너뜀
- 그렇지 않다면(즉, 도달 가능한 숫자라면) 다음 연산을 적용해본다.
- 세 가지 연산 적용
- i * 2 (y 이하일 때만)
- i * 3 (y 이하일 때만)
- i + n (y 이하일 때만)
- 위 연산으로 도달 가능한 숫자 next에 대해
- dp[next] = min(dp[next], dp[i] + 1)
- 아직 도달하지 못했다면 dp[i] + 1 저장
- 이미 값이 있다면 더 작은 값으로 갱신
- 최종 결과 반환
- dp[y] 값이 최소 연산 횟수
- 만약 dp[y] == 0이라면 → 도달 불가능 → -1 반환
Code
class Solution {
public int solution(int x, int y, int n) {
// dp[i] = x에서 i로 가는 최소 연산 횟수
int[] dp = new int[y + 1];
// x부터 y까지 숫자를 차례로 확인하면서 dp를 채움
for (int i = x; i < y + 1; i++) {
// 시작점(x)이 아니고, 아직 도달 못한 숫자라면
if (i != x && dp[i] == 0) {
dp[i] = -1; // 도달 불가 표시
continue; // 이 숫자에서 확장은 못하니까 스킵
}
// 1) 현재 숫자 i에서 *2
if (i * 2 <= y) {
// 아직 안 채워진 곳이면 dp[i]+1 저장
// 이미 값이 있으면 더 작은 값으로 갱신
dp[i * 2] = (dp[i * 2] == 0) ? dp[i] + 1 : Math.min(dp[i] + 1, dp[i * 2]);
}
// 2) 현재 숫자 i에서 *3
if (i * 3 <= y) {
dp[i * 3] = (dp[i * 3] == 0) ? dp[i] + 1 : Math.min(dp[i] + 1, dp[i * 3]);
}
// 3) 현재 숫자 i에서 +n
if (i + n <= y) {
dp[i + n] = (dp[i + n] == 0) ? dp[i] + 1 : Math.min(dp[i] + 1, dp[i + n]);
}
}
// 최종적으로 dp[y] = x에서 y까지 가는 최소 연산 횟수
return dp[y];
}
}
출처
https://sasca37.tistory.com/307#google_vignette
[프로그래머스] - 숫자 변환하기 (JAVA)
숫자 변환하기 (Java) 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. pr
sasca37.tistory.com
'Coding Test > [프로그래머스] Java' 카테고리의 다른 글
| [프로그래머스 / Java, Python] Lv.0 캐릭터의 좌표 (0) | 2025.10.16 |
|---|---|
| [프로그래머스 / Java] Lv.2 [3차] 압축 (0) | 2025.10.12 |
| [프로그래머스 / Java] Lv.1 숫자 짝꿍 (0) | 2025.09.28 |
| [프로그래머스 / Java] Lv.1 로또의 최고 순위와 최저 순위 (0) | 2025.09.27 |
| [프로그래머스 / Java] Lv.2 튜플 (0) | 2025.09.12 |