코딩 테스트/프로그래머스
[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