본문 바로가기

Python(알고리즘,문제풀이)/프로그래머스(코딩기초트레이닝)

코딩기초트레이닝 / 조건에 맞게 수열 변환하기2 - 파이썬

728x90

📚문제

출처 : 프로그래머스(https://school.programmers.co.kr/learn/courses/30/lessons/181881)

 

📝풀이

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 이 정답이 된다

 

728x90