1208. [S/W 문제해결 기본] 1일차 - Flatten

D3

Problem

SW Expert Academy Flatten


Solution

1. 최댓값과 최솟값의 차이를 최소로 만드는 것을 목표로 하고 시작한다.
2. 최댓값과 최솟값이 같아지면 더 이상 옮길 필요가 없다.
3. 최댓값에서 최솟값으로 하나씩 옮기면 언젠가 원하는 곳에 도달한다.

 


Code

# 최댓값과 최솟값 찾기
def max_height(arr):
    max_h = min_h = arr[0]
 
    for i in range(len(arr)):
        if arr[max_h] < arr[i]:
            max_h = i
        if arr[min_h] > arr[i]:
            min_h = i
    return [max_h, min_h]
 
 
for test_case in range(1, 11):
    dump = int(input())
    box_list = list(map(int, input().split()))
    dump_cnt = 0
 
    while True:
    	# 만약 차이가 1보다 크면 최소에서 최대로 한 칸 옮기기
        if box_list[max_height(box_list)[0]] - box_list[max_height(box_list)[1]] > 1:
            box_list[max_height(box_list)[0]] -= 1
            box_list[max_height(box_list)[1]] += 1
            # 카운트
            dump_cnt += 1
            # 카운트가 주어진 횟수가 되면 멈춤
            if dump_cnt == dump:
                break
        else: # 같아지면 멈춤
            break
    print(f'#{test_case} {box_list[max_height(box_list)[0]] - box_list[max_height(box_list)[1]]}')

★ 개선사항

최선의 수가 1칸차이라면, 주어진 횟수를 마칠 때까지 같은 작업을 반복한다. 그럼 필요없는 작업을 반복하기에 
비효율적이다.
이를 효율적으로 바꿀 순 없을까?

<부족한 부분은 댓글로 남겨주시면 저에게 힘이됩니다!>

<그림 출처: SWEA Flatten>

반응형