[문제 출처]
https://school.programmers.co.kr/learn/courses/30/lessons/12980
1. 문제
설명
OO 연구소는 한 번에 K 칸을 앞으로 점프하거나, (현재까지 온 거리) x 2 에 해당하는 위치로 순간이동을 할 수 있는 특수한 기능을 가진 아이언 슈트를 개발하여 판매하고 있습니다. 이 아이언 슈트는 건전지로 작동되는데, 순간이동을 하면 건전지 사용량이 줄지 않지만, 앞으로 K 칸을 점프하면 K 만큼의 건전지 사용량이 듭니다. 그러므로 아이언 슈트를 착용하고 이동할 때는 순간 이동을 하는 것이 더 효율적입니다. 아이언 슈트 구매자는 아이언 슈트를 착용하고 거리가 N 만큼 떨어져 있는 장소로 가려고 합니다. 단, 건전지 사용량을 줄이기 위해 점프로 이동하는 것은 최소로 하려고 합니다. 아이언 슈트 구매자가 이동하려는 거리 N이 주어졌을 때, 사용해야 하는 건전지 사용량의 최솟값을 return하는 solution 함수를 만들어 주세요.
예를 들어 거리가 5만큼 떨어져 있는 장소로 가려고 합니다.
아이언 슈트를 입고 거리가 5만큼 떨어져 있는 장소로 갈 수 있는 경우의 수는 여러 가지입니다.
- 처음 위치 0 에서 5 칸을 앞으로 점프하면 바로 도착하지만, 건전지 사용량이 5 만큼 듭니다.
- 처음 위치 0 에서 2 칸을 앞으로 점프한 다음 순간이동 하면 (현재까지 온 거리 : 2) x 2에 해당하는 위치로 이동할 수 있으므로 위치 4로 이동합니다. 이때 1 칸을 앞으로 점프하면 도착하므로 건전지 사용량이 3 만큼 듭니다.
- 처음 위치 0 에서 1 칸을 앞으로 점프한 다음 순간이동 하면 (현재까지 온 거리 : 1) x 2에 해당하는 위치로 이동할 수 있으므로 위치 2로 이동됩니다. 이때 다시 순간이동 하면 (현재까지 온 거리 : 2) x 2 만큼 이동할 수 있으므로 위치 4로 이동합니다. 이때 1 칸을 앞으로 점프하면 도착하므로 건전지 사용량이 2 만큼 듭니다.
위의 3가지 경우 거리가 5만큼 떨어져 있는 장소로 가기 위해서 3번째 경우가 건전지 사용량이 가장 적으므로 답은 2가 됩니다.
제한사항
- 숫자 N: 1 이상 10억 이하의 자연수
- 숫자 K: 1 이상의 자연수
입출력 예
N | result |
5 | 2 |
6 | 2 |
5000 | 5 |
2. 설명
N의 값과 result값의 상관관계를 알아내는데 많은 시간이 걸렸습니다. 그 결과 2의 배수와 관련이 있다는 것을 알았습니다.
예를들어 5의경우 -> 배터리소모 한칸, 점프슈트로 두번째칸 네번째칸, 마지막으로 배터리를 소모하여 다섯번째 칸에 도착했습니다.
따라서 도착지점에서 출발지점으로 내려가는 식으로 구현하였습니다.
먼저 배터리 소모값을 체크합니다. -> 칸이 2로 나누어 떨어지지 않는다면 나머지를 배터리소모값( battery )에 더하기
도착지점에서 2를 나누어 그 전도착지점으로 이동합니다. -> 점프 슈트를 사용하여 이동하는것이기때문에 배터리는 쓰지않고 거리( i )를 2로 나누었습니다.
문제를 처음 보았을때 엄청 복잡하게 생각했는데 규칙만 알면 간단한 문제였습니다.
3. 코드
#include <iostream>
using namespace std;
int solution(int n)
{
int battery=0;
for(int i=n; i>0; i/=2)
battery+= i%2;
return battery;
}
'코테준비 > 수학적 알고리즘' 카테고리의 다른 글
[프로그래머스][C++][42746] 가장 큰 수 (0) | 2023.02.22 |
---|---|
[프로그래머스][C++][12913] 땅따먹기 (0) | 2023.02.20 |
[프로그래머스][C++]n^2배열 자르기 (0) | 2023.02.10 |
[프로그래머스][C++] 멀리 뛰기 (0) | 2023.02.01 |
[프로그래머스][c++] 예상 대진표 (0) | 2023.01.31 |
댓글