코딩테스트 연습
Summer/Winter Coding(~2018)
점프와 순간 이동
점프 또는 순간이동을 하여 n의 자리로 이동할 때의 건전지 사용량의 최소를 구하시오.
점프로 이동할 때는 +1이 소모되고 순간이동 할 때는 건전지가 소모되지 않는다.
dp를 이용한 풀이.
1부터 시작해서 *2 또는 +1을 한 값을 큐에 넣고 dp에 이동 최소값을 저장함.
숫자 N은 최대 10억이라는 조건을 지나쳤다. 때문에 효율성 채점에서 모두 시간 초과가 떴다.
function solution(n) {
let ans = 0;
const dp = {};
let queue = [];
let visited = Array(n).fill(0);
queue.push([1, 1]);
while (queue.length) {
let [cur, cnt] = queue.shift();
if (cur === n) {
ans = cnt;
break;
}
if (cur > n) continue;
if (visited[cur]) dp[cur] = Math.min(cnt, dp[cur]);
else dp[cur] = cnt;
visited[cur] = 1;
queue.push([cur * 2, cnt]);
queue.push([cur + 1, cnt + 1]);
}
return ans
}
첫 번째 풀이와 비교도 안 되게 간단하다.
n부터 시작해서 /2를 수행하고 나머지가 발생한다면 -1을 하여 1에 도달할 때까지의 이동값을 구하면 된다.
function solution(n) {
let ans = 1;
while(n!==1){
if(n%2===0){
n=n/2
}else{
n--
ans++
}
}
return ans
}
조건을 꼼꼼하게 읽자.
레벨만 보고 너무 복잡하게 생각하려는 태도를 바꿔야 하겠다.
출처 : 프로그래머스