📚문제
📝풀이
def solution(arr):
answer = 0
cnt = 0
while cnt != len(arr): # while구문 (cnt와 arr의 길이가 같지 않다면) 실행
cnt= 0
before_arr = arr.copy()
for i in range(len(arr)):
if arr[i] >= 50 and arr[i]%2==0:
arr[i] //=2 # arr[i]를 2로 나눈 후 그 결과를 다시 arr[i]에 할당(소수부분 버리고 정수 부분만 반환)
elif arr[i] <50 and arr[i]%2!=0:
arr[i] = 2*arr[i] + 1
if arr[i] == before_arr[i]:
cnt += 1
answer += 1
return answer-1
파이썬으로는 풀이가 없어서
다른 분의 Java 풀이를 참고하고 응용해서 파이썬으로 풀어봤다
▼아래는 참고한 Java 코드 출처 링크
포인트는 2가지다
1.
before_arr = arr.copy()
while문을 돌리는것까지는 생각했는데
arr과 그 다음 arr(=arr+1)을 어떻게 변화시켜줘야 하는걸까를 제일 많이 고민했다
arr변수명에 숫자를 붙여서 계속 변화시키는 방법을 생각해봤는데...답을 찾다가 포기했다
그래서 간단히 arr.copy()를 만들어주는 방법을 찾았다
그러면 for문을 돌면서 arr은 변화하고 before_arr은 초기 arr의 값을 계속 가지고 있는다
그 다음 arr이 모든 작업을 거친다음 before_arr을 비교한 후에
while문이 초기화되면서 before_arr은 바뀐 arr로 바뀐다
예시를 들어보면
1. before_arr = arr.copy()
arr = [1, 2, 3, 100, 99, 98]
before_arr = [1, 2, 3, 100, 99, 98]
2. for문 (작업)을 거침
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*arr[i] + 1
arr = [3, 2, 7, 50, 99, 49]
before_arr = [1, 2, 3, 100, 99, 98]
3. if문 비교후에 answer깂에 1을 추가하고(1회작업했으니 카운트 추가) while문 초기화
arr는 전역변수라서 arr = [3, 2, 7, 50, 99, 49] 값을 그대로 유지하고
before_arr는 while문이 초기화되면서
before_arr = [3, 2, 7, 50, 99, 49]
로 바뀌며 지속적으로 반복 가능
이 문제에서 이 아이디어가 가장 중요한 핵심인 것 같다
2.
if arr[i] == before_arr[i]:
cnt +=1
for문을 돌며 그때그때 이전 리스트(before_arr)과 비교한다
같다면 cnt에 += 1 할당
while구문에서 cnt == len(arr)과 같아진다는것은
작업한 이후의 arr의 모든 요소가 before_arr의 모든 요소와 같아진다는것(문제에서 원하는 조건)
같지 않다면 작업을 계속 반복하고
같아진다면 그때의 answer(같아지기 위해 작업을 몇 번 반복했나) 반환
이 때 answer는 같아졌을 때의 작업횟수이므로
( arr(x) = arr(x+1) 에서 x+1 )
answer -1 이 정답이 된다
'Python(알고리즘,문제풀이) > 프로그래머스(코딩기초트레이닝)' 카테고리의 다른 글
코딩기초트레이닝 / 빈 배열에 추가,삭제하기 - 파이썬 (POP) (0) | 2023.10.31 |
---|---|
코딩기초트레이닝 / 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기(rindex) (0) | 2023.10.27 |
코딩기초트레이닝 / 가까운 1찾기 (0) | 2023.10.18 |
코딩기초트레이닝 / 문자 개수 세기 (0) | 2023.10.18 |
코딩기초트레이닝 / 문자열 여러 번 뒤집기 (0) | 2023.10.12 |