Python/코딩 테스트

프로그래머스 Lv 1 파이썬 콜라츠 추측 외 3문제

Young_Metal 2022. 9. 19. 12:15

정수 제곱근 판별(88%)

import math
def solution(n):
    x = math.sqrt(n)
    if x % 1 == 0 :
        answer = (x+1)**2
    else:
        answer = -1
    return answer

 

자연수 뒤집어 배열로 만들기(88%)

def solution(n):
    answer = list(str(n))
    answer.reverse()
    return list(map(int, answer))

문자열 내 p와 y의 개수

def solution(s):
    n = list(s)
    p = 0
    y = 0
    for i in range(len(n)):
        if 'p' in n[i] or 'P' in n[i]:
            p +=1
        elif 'y' in n[i] or 'Y' in n[i]:
            y +=1
    if p==y:        
        answer = True
    else :
        answer = False

    return answer

콜라츠 추측

처음에 이렇게 풀었는데 안됬다. 그래서 구글링을 해서 본 결과 

    answer = 0
    if num == 1:
        answer = 0
    while True:
        if num%2==0:
            num = num/2
            answer += 1
        elif num%2==1:
            num = num*3+1
            answer += 1
        if answer > 500 and num !=1:
            answer= -1
            break
    return answer

아래의 코드는 되었다. 

    answer = 0
    
    if num == 1:
        return 0
    
    while True:
        num = num/2 if num % 2 == 0 else (num*3)+1
        answer += 1
        if num == 1:
            return answer 
        elif answer == 500:
            return -1
    
    return answer
출처: https://wooaoe.tistory.com/76 [개발개발 울었다:티스토리]

분석을 해보면 아무래도 if문들을 써서 그런거 같다. if와 elif들로 조건을 설정하다가 마지막 elif의 조건을 항상 가지 못하는 듯 하다. 그래서 다시 바꿔봤다. 그냥 else쓰고, answer+=1의 조건은 num이 짝수일 때나 홀수인건 당연하니까 두 조건문 이후에 무조건 주는 것으로, 그리고 그 이후 if를 쓸까 하다가 answer가 500이상이 되면 break하는 것을 먼저 했다. 

def solution(num):
    answer = 0
    if num == 1:
        answer = 0
    while num !=1:
        if answer > 500:
            answer= -1
            break
        if num%2==0:
            num = num/2
        else:
            num = num*3+1
        answer += 1

    return answer