

난이도 : Level 0
출처 : 프로그래머스
정수 배열 arr가 주어지고, 특정 규칙에 따라 배열의 원소 값을 변환해야 한다.
규칙은 다음과 같다.
이 작업을 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