https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV139KOaABgCFAYh
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
한 쪽 벽면에 다음과 같이 노란색 상자들이 쌓여 있다.
높은 곳의 상자를 낮은 곳에 옮기는 방식으로 최고점과 최저점의 간격을 줄이는 작업을 평탄화라고 한다.
평탄화를 모두 수행하고 나면, 가장 높은 곳과 가장 낮은 곳의 차이가 최대 1 이내가 된다.
평탄화 작업을 위해서 상자를 옮기는 작업 횟수에 제한이 걸려있을 때, 제한된 횟수만큼 옮기는 작업을 한 후 최고점과 최저점의 차이를 반환하는 프로그램을 작성하시오.

가장 높은 곳에 있는 상자를 가장 낮은 곳으로 옮기는 작업을 덤프라고 정의한다.
위의 예시에서 제1회 덤프를 수행한 이후 화면은 다음과 같다.

A부분의 상자를 가장 낮은 B부분에 덤프하였으며, A대신 A’부분의 상자를 사용해도 무방하다.
다음은 제2회 덤프를 수행한 이후의 화면이다.

A’부분의 상자를 옮겨서, C부분에 덤프하였다. 이때 C 대신 C’부분에 덤프해도 무방하다.
2회의 덤프 후, 최고점과 최저점의 차이는 8 – 2 = 6 이 되었다 (최초덤프 이전에는 9 – 1 = 8 이었다).
덤프 횟수가 2회로 제한된다면, 이 예시 문제의 정답은 6이 된다.
[제약 사항]
가로 길이는 항상 100으로 주어진다.
모든 위치에서 상자의 높이는 1이상 100이하로 주어진다.
덤프 횟수는 1이상 1000이하로 주어진다.
주어진 덤프 횟수 이내에 평탄화가 완료되면 더 이상 덤프를 수행할 수 없으므로 그 때의 최고점과 최저점의 높이 차를 반환한다 (주어진 data에 따라 0 또는 1이 된다).
[입력]
총 10개의 테스트 케이스가 주어지며, 각 테스트 케이스의 첫 번째 줄에는 덤프 횟수가 주어진다. 그리고 다음 줄에 각 상자의 높이값이 주어진다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 최고점과 최저점의 높이 차를 출력한다.
그림만 보면 다소 복잡해보이지만, 입력을 살펴보면 리스트 형태로 주어지기 때문에 최대/최소값을 다뤄서 쉽게 해결할 수 있습니다.
입력으로 덤프(최댓값에서 1빼고, 최솟값에 1 더하는 행위)의 횟수와 일차원 배열이 주어지므로,
덤프의 횟수를 0으로 만드는 것을 목표로 덤프를 계속 진행해주면 되겠습니다.
저는 while문을 통해 덤프횟수가 0이 아닌 동안에 최댓값과 최솟값의 인덱스를 각각 구해서
배열에서 해당 인덱스에 대해서 덤프를 바로 진행하는 방법을 사용했습니다.
코드
#swea 1208 flatten
for t in range(10):
n = int(input())
arr = list(map(int, input().split()))
while n > 0:
max_idx = arr.index(max(arr))
min_idx = arr.index(min(arr))
arr[max_idx] -= 1
arr[min_idx] += 1
n -= 1
print(f"#{t+1}", max(arr) - min(arr))
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] N과 M(1) (백준 15649번 파이썬) (0) | 2023.11.02 |
---|---|
[Python] 빙산 (백준 2573번 파이썬) (1) | 2023.11.01 |
[Python] 길찾기 (SWEA 1219번 파이썬) (0) | 2023.10.31 |
[Python] Sum (SWEA 1209번 파이썬) (0) | 2023.10.29 |
[Python] 적록색약 (백준 10026번 파이썬) (0) | 2023.10.27 |