Post

[Programmers] #181881 - 조건에 맞게 수열 변환하기 2 [Java][C++][Python]

50 이상 짝수는 절반으로, 50 미만 홀수는 2배 뒤 1을 더하는 연산을 배열에 반복 적용할 때 배열이 더 이상 변하지 않게 되는 최소 반복 횟수를 구하는 문제.

[Programmers] #181881 - 조건에 맞게 수열 변환하기 2 [Java][C++][Python]

문제 링크


1. 아이디어

주어진 연산을 배열 전체에 한 번 적용하는 것을 한 단계로 보고, 배열이 더 이상 변하지 않을 때까지 시뮬레이션하며 단계 수를 센다. 직전 배열과 현재 배열이 같아지는 순간의 단계 수가 답이다.


2. 복잡도

접근시간공간
풀이$O(N)$$O(N)$

($N$ = arr의 길이)


3. 코드

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.*;

class Solution {
    public int solution(int[] arr) {
        int[] prv = arr;
        int x = 0;

        while (true) {
            int[] cur = step(prv);

            if (Arrays.equals(prv, cur)) return x;
            prv = cur;
            x++;
        }
    }

    static int[] step(int[] arr) {
        int[] res = arr.clone();

        for (int i = 0; i < res.length; i++) {
            if (res[i] >= 50 && res[i] % 2 == 0) {
                res[i] /= 2;
            } else if (res[i] < 50 && res[i] % 2 != 0) {
                res[i] = res[i] * 2 + 1;
            }
        }

        return res;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
using namespace std;

vector<int> step(vector<int> v) {
    for (int& x : v) {
        if (x >= 50 && x % 2 == 0) {
            x /= 2;
        } else if (x < 50 && x % 2) {
            x = x * 2 + 1;
        }
    }

    return v;
}

int solution(vector<int> arr) {
    vector<int> prv = arr;
    int x = 0;

    while (true) {
        vector<int> cur = step(prv);

        if (prv == cur) return x;
        prv = cur;
        x++;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(arr):

    def transform(num):
        if num >= 50 and num % 2 == 0:
            return num // 2
        if num < 50 and num % 2:
            return num * 2 + 1
        return num

    prv = arr
    x = 0

    while True:
        cur = [transform(num) for num in prv]
        if prv == cur:
            return x
        prv = cur
        x += 1

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