본문 바로가기
  • 머킹이의 머신로그
오늘부터 코딩테스트

[오늘부터 코딩테스트]파이썬으로 프로그래머스 코딩 기초 프로그램 풀기

by 머킹 2023. 10. 19.
728x90

[파이썬] 프로그래머스 Lv0. 조건에 맞게 수열 변환하기 1,  조건에 맞게 수열 변환하기 2

안녕하세요. 머킹입니다.

오랜만에 프로그래머스 해보겠습니다!!

 


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

 

문제 설명

정수 배열 arr가 주어집니다. 

arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다.

그 결과인 정수 배열을 return 하는 solution 함수를 완성해 주세요.

def solution(arr):
    result = []
    for num in arr:
        if num >= 50 and num % 2 == 0:
            result.append(num // 2)
        elif num < 50 and num % 2 == 1:
            result.append(num * 2)
        else:
            result.append(num)
            
    return result

수열 변환하는 거 재밌네요!

처음에 % 2 하는 것도 어려웠는데ㅎㅎ

 


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

 

문제 설명

정수 배열 arr가 주어집니다.

arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.

이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다.

이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.

단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.

 

이건 문제가 되게 복잡하네요!

예시를 보면 더 이해가 됩니다.

주어진 배열 arr에 대해 특정 조건에 따라 변환하는 작업을 반복하다가,

변환이 더 이상 일어나지 않는 순간을 찾아야 하는 문제입니다.

def solution(arr):
    idx = 0
    prev = arr
    
    while True:
        change = []
        for i in prev:
            if i >= 50 and i % 2 == 0: change.append(int(i / 2))
            elif i < 50 and i % 2 == 1: change.append(i * 2 + 1)
            else: change.append(i)

        same = all(a == b for a, b in zip(prev, change))
        if same:
            break
        idx += 1

        prev = change
    
    return idx

이렇게 하면 결과가 잘 나옵니다.

꽤 많은 시행착오를... 겪었어요...ㅎㅎ

 

원래 이 코드를 썼는데

테스트를 통과를 못하더라고요.

def solution(arr):
    def transform_element(num):
        if num >= 50 and num % 2 == 0:
            return num // 2
        elif num < 50 and num % 2 == 1:
            return num * 2 + 1
        return num

    def are_arrays_equal(arr1, arr2):
        return all(arr1[i] == arr2[i] for i in range(len(arr1)))

    x = 0
    while True:
        new_arr = [transform_element(num) for num in arr]
        x += 1
        if are_arrays_equal(arr, new_arr):
            break
        arr = new_arr

    return x

이상으로 오늘 해본 코테였습니다!

다들 건강하세요..