Post

[Programmers] #181880 - 1로 만들기 [Java][C++][Python]

리스트의 각 원소를 짝수면 2로 나누고 홀수면 1을 뺀 뒤 2로 나누는 연산을 반복해 모두 1로 만들 때 필요한 총 연산 횟수를 구하는 워밍업 문제.

[Programmers] #181880 - 1로 만들기 [Java][C++][Python]

문제 링크


1. 아이디어

홀수 x에서 1을 뺀 뒤 2로 나누는 연산은 정수 나눗셈 $\lfloor x / 2 \rfloor$와 결과가 같다. 짝수는 그냥 2로 나누므로, 결국 짝수·홀수를 구분할 필요 없이 각 원소를 1이 될 때까지 2로 나누며 횟수를 세고 모두 합하면 된다. 한 원소당 연산 횟수는 $\lfloor \log_2 x \rfloor$이다.


2. 복잡도

접근시간공간
풀이$O(N \log V)$$O(1)$

($N$ = num_list의 길이, $V$ = 원소의 최댓값)


3. 코드

풀이 [Java][C++][Python]

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
    public int solution(int[] num_list) {
        int cnt = 0;
        for (int x : num_list) {
            while (x > 1) {
                x /= 2;
                cnt++;
            }
        }

        return cnt;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <bits/stdc++.h>
using namespace std;

int solution(vector<int> num_list) {
    int cnt = 0;
    for (int x : num_list) {
        while (x > 1) {
            x /= 2;
            cnt++;
        }
    }

    return cnt;
}
1
2
3
4
5
6
7
8
def solution(num_list):
    cnt = 0
    for x in num_list:
        while x > 1:
            x //= 2
            cnt += 1

    return cnt

This post is licensed under CC BY 4.0 by the author.