조건에 맞게 수열 변환하기 2

송용진·2023년 9월 9일
0

알고리즘

목록 보기
113/173

정수 배열 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로 바꾸어도 코드의 기능에는 영향을 주지 않습니다. 그러나 명시적으로 얕은 복사를 표현하려는 의도를 나타내기 위해 [:]를 사용한 것일 수 있습니다.

profile
백엔드 개발자

0개의 댓글