정수 배열 arr가 주어집니다.
arr의 각 원소에 대해
값이 50보다 크거나 같은 짝수라면
2로 나누고,
50보다 작은 홀수라면
2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을
arr(x)라고 표현했을 때,
arr(x) = arr(x + 1)인 x가 항상 존재합니다.
이러한 x 중 가장 작은 값을 return 하는
solution 함수를 완성해 주세요.
단, 두 배열에 대한 "="는
두 배열의 크기가 서로 같으며,
같은 인덱스의 원소가 각각 서로 같음을 의미합니다.
내 코드
import copy
def solution(arr):
answer = -1
while True:
answer += 1
arr0 = copy.deepcopy(arr)
for i,e in enumerate(arr):
if e >= 50 and e % 2 == 0:
arr[i] = int(e / 2)
elif e < 50 and e % 2 == 1:
arr[i] = 2*e + 1
if arr0 == arr:
break
return answer
예시 코드
def solution(arr):
ret = 0
while True:
tmp = list(map(lambda x: x // 2 if x >= 50 and ~x & 1 else x * 2 + 1 if x < 50 and x & 1 else x, arr[:]))
if arr == tmp:
break
arr = tmp[:]
ret += 1
return ret
코드 내에서 tmp[:] 또는 arr[:]와 같은 표현을 사용한 것은, 원본 리스트의 내용을 유지하면서 새로운 리스트에 복사하고자 하는 의도를 명확하게 나타내려는 것일 수 있습니다.
사실, 코드 내에서 arr = tmp와 같이 간단하게 작성해도 동작에는 아무 문제가 없습니다. 하지만, 코드를 처음 보는 사람이나 미래의 자신을 위해서 의도를 명확하게 표현하는 것은 좋은 코드 작성 습관 중 하나입니다.
결론적으로, tmp[:]를 tmp로 바꾸어도 코드의 기능에는 영향을 주지 않습니다. 그러나 명시적으로 얕은 복사를 표현하려는 의도를 나타내기 위해 [:]를 사용한 것일 수 있습니다.