코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.0 조건에 맞게 수열 변환하기2

위시리 2024. 11. 2. 03:07

 

문제 분석

  • 정수 배열 arr
  • 각 원소에 대해 50보다 크거나 같은 짝수 >> //2
  • 50보다 작은 홀수 >> *2 + 1
  • 이러한 작업을 x번 반복한 결과를 arr(x)라 할 때
  • arr(x) = arr(x+1)인 x가 항상 존재
  • 이러한 x 중 가장 작은 값을 return

 

코드 설계

  • 새로 업데이트 하면서 새로운 2차원 리스트에 저장하면서 비교?

 

정답 코드

 실패..

def solution(arr):
    answer = 0
        
    def change(arr) : 
        for i in range(len(arr)) : 
            if (arr[i] >= 50) and (arr[i] % 2 == 0) : 
                arr[i] // 2
            elif (arr[i] < 50) and (arr[i] % 2 != 0) ;
                arr[i] * 2 + 1
        return arr

    return answer

 

다른 사람 코드

def solution(arr) : 
    answer = 0
    old = arr
    while(True) : 
        new = []
        for i in old : 
            if i >= 50 and i % 2 == 0 :
                i = i/2
            elif i < 50 and i % 2 != 0 : 
                i = i*2 + 1
            new.append(int(i))
        if old == new : 
            break
        else : 
            old = new
            answer += 1
    return answer

 

2번째 풀이 (1) - 실패

def solution(arr):
    answer = 0
    while True:
        tmp = arr
        for i in range(len(arr)):
            if arr[i] % 2 == 0 and arr[i] >= 50:
                arr[i] = arr[i] / 2
            elif arr[i] % 2 != 0 and arr[i] < 50:
                arr[i] = arr[i] * 2 + 1
        answer += 1
        if arr == tmp:
            break

    return answer

arr = [1, 2, 3, 100, 99, 98]
print(solution(arr))
  • 반복문을 돌면서 수열을 변환할 때 arr 값이 변하면 tmp 값이 같이 변함
  • arr = tmp 과 같이 다른 변수에 할당하면 두 변수가 같은 리스트(객체)를 가리키므로 값을 변경할 때 같이 변경된다.
  • 1차원 리스트의 경우 copy( ) 메소드를 이용하여 새로운 객체를 생성하여 값을 복사할 수 있다.
  • 넣기 전 리스트와 바뀐 후 리스트를 둘 다 가지고 있어야 함 (그리고 비교)

 

2번째 풀이 (2) - 정답

def solution(arr):
    answer = 0
    def copyArr(arr1) :
        arr2 = []
        for i in range(len(arr1)):
            arr2.append(arr1[i])
        return arr2

    while True:
        tmp = copyArr(arr)
        for i in range(len(arr)):
            if arr[i] % 2 == 0 and arr[i] >= 50:
                arr[i] = arr[i] // 2
            elif arr[i] % 2 != 0 and arr[i] < 50:
                arr[i] = arr[i] * 2 + 1
        answer += 1
        if tmp == arr:
            answer -= 1 # arr(x) == arr(x+1) 일 때의 x를 return
            break
    return answer