설명
높은 곳의 상자를 낮은 곳에 옮기는 방식으로 최고점과 최저점의 간격을 줄인다.
제한된 횟수만큼 옮기는 작업을 한 후 최고점과 최저점의 차이를 반환한다.
제한된 횟수 전에 평탄화 작업이 완료되면 그 때의 최고점과 최저점의 차이를 반환한다.
풀이
min과 max를 쓰면서 반복한다.
1. 최고점과 최저점을 찾아 따로 저장한다.
2. 리스트에서 최고점과 최저점을 제거한다.
3. 제한됫 횟수가 됐거나, 끝나지 않았는데 평탄화가 됐다면(최고점과 최저점이 같아졌다면) 멈춘다.
4. 그게 아니면 최고점에서 1을 빼고, 최저점에서 1을 더한 후 리스트에서 넣어준다.
5. 마지막으로 최고점과 최저점의 차이를 출력한다.
Solution
for tc in range(1, 11):
dump = int(input())
box = list(map(int, input().split()))
top = 0
bottom = 0
for i in range(dump+1):
top = max(box)
bottom = min(box)
box.remove(top)
box.remove(bottom)
if i == dump or top == bottom: #if문 없으면 마지막에 한 번 더 덤프하기 때문에 추가
break
else: #덤프
top -= 1
bottom += 1
box.append(top)
box.append(bottom)
print('#'+str(tc), top-bottom)
👩💻회고
1차 제출에 실패했다. 테스트 파일 중 9개가 맞다고 해서 문제를 다시 읽어보았는데, 덤프 횟수 이내에 평탄화가 완료되면 수행할 수 없으므로 그 때의 최고점과 최저점의 높이차를 반환해야 한다는 걸 이제야 발견했다.
그래서 조건문을 추가해서 제출하려 했는데 또 실패할 것 같다는 예감이 들어서 댓글을 한번 봤다. 그런데 다른 사람들도 나와 똑같은 문제에 직면했었던 것!!! 불행 중 다행이라고 생각했다.
6번 인풋 파일에서 출력 결과가 15였는데 올바른 답은 14였다. dump+1을 해줘야 한다고 해서 수정 후 제출했더니 정답 처리가 되었다.. +1을 해줘야 하는 이유는 '덤프가 모두 완료된 후에 차이를 구하라'라는 문제 때문이다.
🔧보완할 점
리스트에서 제거하고 삽입하는 과정을 없애고 리스트의 인덱스를 더하고 빼는 코드를 추가하면 더 좋았을 것 같다. 정렬을 쓸까도 했지만 그냥 처음에 생각한대로 구현했다.
for tc in range(1, 11) :
dump = int(input())
box = list(map(int, input().split()))
for _ in range(dump) :
top = box.index(max(box))
box[top] -= 1
bottom = box.index(min(box))
box[bottom] += 1
ans = max(box) - min(box)
print('#%d %d' % (tc, ans))
'SWEA' 카테고리의 다른 글
[SWEA] 4466. 최대 성적표 만들기 (Python/D2) (1) | 2023.11.19 |
---|---|
[SWEA] 2007. 패턴 마디의 길이 (Python/D2) (0) | 2023.11.19 |
[SWEA] 1206. [S/W 문제해결 기본] 1일차 - View (Python/D3) (0) | 2023.11.16 |
[SWEA] 5431. 민석이의 과제 체크하기 (Python/D3) (2) | 2023.11.16 |
[SWEA] 1217. [S/W 문제해결 기본] 4일차 - 거듭 제곱 (Python/D3) (0) | 2023.11.16 |