알고리즘/프로그래머스

[프로그래머스]Lv2. 우박수열 정적분(Python)

cha_eyoon 2024. 2. 29. 19:05

https://school.programmers.co.kr/learn/courses/30/lessons/134239

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 접근

 

난이도가 높지 않은 단순 구현 문제이다.

문제를 읽으며 주의해야 할 부분을 우선 정리했다.

 

1. 구간 설정 주의

주어진 ranges의 원소를 x=a, x=n-b로 꼼꼼하게 잘 바꿔주기

2. 사다리꼴의 높이는 무조건 1이므로 전체 넓이를 구하기 위해서는 사다리꼴의 넓이를 누적시켜야한다. 

3. 주어진 범위 a > b인 경우에는 -1.0을 반환하는 예외 신경쓰기

 

<시간 복잡도>

O(N^2)

 

코드
def solution(k, ranges):
    answer = []
    graph = []
    x = 0 
    graph.append([x, k])
    
    while k != 1:   # 그래프 완성하기
        x += 1
        if k % 2 == 0:
            graph.append([x, k//2])
            k = k//2
        else:
            graph.append([x, k*3+1])
            k = k*3+1
    
    n = len(graph)-1    # 가로구간의 길이 
        
    for i in ranges:
        a = i[0]    
        b = n+i[1]  
        k = b-a # 사다리꼴의 개수(=반복 횟수)
        area = 0    # 누적할 공간변수 선언 
        if a <= b:  
            for j in range(k):
                area += 0.5 * (graph[a][1]+graph[a+1][1])   # 사다리꼴 넓이 공식 적용 
                a += 1  # 우측으로 1씩 이동 
        else:
            area = -1.0
        answer.append(area) 
        
    return answer

 

문제 회고

 

단순 구현 문제임에도 40분 걸려서 현타옴... ㅋ