문제
1로 만들기 : 문제 링크
문제 분석
- 정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 된다. 예를 들어 10이 있다면 다음과 같은 과정으로 1이 된다.
- 10 / 2 = 5
- (5 - 1) / 2 = 4
- 4 / 2 = 2
- 2 / 2 = 1
- 위와 같이 4번의 나누기 연산으로 1이 되었다. 정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return
- 나누기 연산의 횟수를 저장할 answer을 0으로 초기화. for loop를 통해 num_list의 첫번째부터 마지막 원소까지 순환하고, 각 원소를 while문을 통해 나누기 연산을 수행. while문의 조건문을 num_list[i]가 1이 아님으로 설정하고, num_list[i]를 2로 나눈 몫을 저장하고 연산을 수행할때마다 answer을 1씩 증가(짝수든 홀수든 몫만 저장하므로, 홀수일때 굳이 1을 뺀 후 반으로 나눌필요 X). 최종적으로 저장된 answer을 return
풀이
#include <vector>
using namespace std;
int solution(vector<int> num_list) {
int answer = 0;
for(int i = 0; i < num_list.size(); ++i) {
while(num_list[i] != 1) {
num_list[i] = num_list[i] / 2;
answer++;
}
}
return answer;
}