카테고리 없음
[프로그래머스>Lv2] 숫자 변환하기
RIEN😚
2023. 2. 3. 18:10
728x90
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제
자연수 x를 y로 변환하려고 합니다.
- x에 n을 더합니다.
- x에 2를 곱합니다.
- x에 3을 곱합니다.
[입력]
자연수 x, y, n
[출력]
x를 y로 변환하기 위해 필요한 최소 연산 횟수를 return
🌹 x를 y로 만들 수 없다면 -1을 return
2. 풀이
문제를 보면 딱 너비우선탐색(BFS)을 사용하여 풀 수 있는 전형적인 문제입니다.
하나의 수에서 진행할 수 있는 경로는 3가지가 있습니다.
- n 더하기
- 2 곱하기
- 3 곱하기
위 경로를 순차적으로 탐색하다, y와 만나면 연산 횟수를 반환하면 됩니다.
* 이 때, 연산의 결과가 y보다 커질 경우에는 더 이상 진행하지 않는다는 조건문이 중요합니다.
만약 이를 추가하지 않는다면 무한루프에 갇히게 될 것입니다. 🤗👍🏻
그리고 또한 동일한 숫자를 여러번 탐색하지 않도록 cache를 추가해주도록 하겠습니다.
3. 코드
kotlin
import java.util.PriorityQueue
class Solution {
fun solution(x: Int, y: Int, n: Int): Int {
// 숫자, 연산 횟수
val queue = PriorityQueue<Pair<Int, Int>> { a, b -> a.first - b.first }
queue.add(x to 0)
val cache = IntArray(y + 1) { y + 1 }
while (queue.isNotEmpty()) {
val (number, time) = queue.poll()!!
if (number == y) return time
if (number + n <= y && cache[number + n] > time + 1 ) {
cache[number + n] = time + 1
queue.add(number + n to time + 1)
}
if (number * 2 <= y && cache[number * 2] > time + 1) {
cache[number * 2] = time + 1
queue.add(number * 2 to time + 1)
}
if (number * 3 <= y && cache[number * 3] > time + 1) {
cache[number * 3] = time + 1
queue.add(number * 3 to time + 1)
}
}
return -1
}
}
python
from heapq import heappush, heappop
def solution(x, y, n):
answer = 0
queue = []
heappush(queue, (x, 0))
cache = [y+1] * (y+1)
while queue:
num, time = heappop(queue)
if num == y:
return time
if num + n <= y:
if cache[num+n] > time+1:
cache[num+n] = time+1
heappush(queue, (num+n, time+1))
if num * 2 <= y:
if cache[num*2] > time+1:
cache[num*2] = time+1
heappush(queue, (num*2, time+1))
if num * 3 <= y:
if cache[num*3] > time+1:
cache[num*3] = time+1
heappush(queue, (num*3, time+1))
return -1
반응형