프로그래머스 - 조건에 맞게 수열 변환하기 2 [JS]

kimminjunnn·2026년 6월 8일

알고리즘

목록 보기
313/322

난이도 : Level 0
출처 : 프로그래머스


문제 이해

정수 배열 arr가 주어지고, 특정 규칙에 따라 배열의 원소 값을 변환해야 한다.

규칙은 다음과 같다.

  • 값이 50 이상이면서 짝수라면 2로 나눈다.
  • 값이 50 미만이면서 홀수라면 2를 곱하고 1을 더한다.
  • 그 외의 값은 그대로 둔다.

이 작업을 x번 반복한 결과 배열을 arr(x)라고 하고,
한 번 더 반복한 결과 배열을 arr(x + 1)이라고 했을 때,

arr(x) = arr(x + 1)을 만족하는 가장 작은 x를 return 해야 한다.

문제에서는 이러한 x가 항상 존재한다고 한다.

해결 아이디어

이 문제를 보고 먼저 떠올린 것은 조건에 따라 원소를 조작하는 함수를 따로 함수를 선언해서 빼서 풀어야겠다는 생각이었다.

같은 규칙을 계속 반복해서 적용해야 하므로,
배열을 한 번 변환하는 함수 formula를 만들면 좋을 것 같았다.

그리고 문제에서 arr(x) = arr(x + 1)을 만족하는 x가 항상 존재한다고 했으므로,
while (true)를 이용해 반복하다가 배열이 더 이상 변하지 않는 순간 x를 return 하면 된다고 생각했다.

정답 코드

function solution(arr) {
  
    function formula(array) {
        return array.map((v) => {
            if (v >= 50 && v % 2 === 0) {
                return v / 2;
            } else if (v < 50 && v % 2 === 1) {
                return v * 2 + 1;
            }
            return v;
        });
    }

  
    let x = 0;

    while (true) {
        const next = formula(arr);

        const isSame = arr.every((v, i) => v === next[i]);

        if (isSame) {
            return x;
        }

        arr = next;
        x += 1;
    }
}

formula 함수는 배열의 원소를 문제의 규칙에 따라 한 번 변환한 새로운 배열을 반환한다.

그 후 while (true)를 사용해 계속해서 배열을 변환한다.

문제에서 arr(x) = arr(x + 1)을 만족하는 x가 항상 존재한다고 했기 때문에,
배열이 더 이상 변하지 않는 순간 현재의 x가 정답이 된다.


배열 비교에서 주의할 점

JS에서는 배열의 일치를 확인할 때 다음과 같이 비교하면 안 된다.

const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];

arr1 === arr2; // false

두 배열의 원소 값은 같지만,
서로 다른 배열 객체를 가리키고 있기 때문에 false가 나온다.

즉, JS에서 배열끼리 ===로 비교하면 내부 원소의 값이 아니라
배열 객체의 참조값을 비교한다.

그래서 이 문제에서는 every 메서드를 사용해
각 인덱스의 원소 값이 모두 같은지 비교했다.

const isSame = arr.every((v, i) => v === next[i]);

이 코드는 arr의 모든 원소 v가
같은 인덱스에 있는 next[i]와 같은지 확인한다.


파이썬 코드

def solution(arr):
    def formula(array):
        result = []

        for v in array:
            if v >= 50 and v % 2 == 0:
                result.append(v // 2)
            elif v < 50 and v % 2 == 1:
                result.append(v * 2 + 1)
            else:
                result.append(v)

        return result

    x = 0

    while True:
        next_arr = formula(arr)

        is_same = arr == next_arr

        if is_same:
            return x

        arr = next_arr
        x += 1

파이썬에서는 JS와 다르게 리스트끼리 == 연산자로 비교하면
내부 원소의 값이 같은지 비교할 수 있다.

[1, 2, 3] == [1, 2, 3] # True

반면 JS에서 배열끼리 ===로 비교하면
내부 원소가 아니라 배열 객체의 참조값을 비교한다.

const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];

arr1 === arr2; // false

즉, JS에서는 배열의 내부 값을 비교하려면 every 등을 사용해야 하고,
Python에서는 리스트의 내부 값 비교를 ==로 바로 할 수 있다.

만약 Python에서 같은 객체를 가리키는지 비교하고 싶다면 is를 사용한다.

a = [1, 2, 3]
b = a

a is b # True

0개의 댓글