https://swexpertacademy.com/main/main.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
이 문제 진짜 ;;; ㅋㅋㅋㅋㅋ
괜히 lv2 정답율 최하 문제가 아니다.
input 파일이 정말 말도 안되게 길다.
엄청 많은 데이터가 입력되는 문제다.
원래는 아래와 같이 풀려고 했다.
숫자 다 받아서 map,list로 묶어줌
→ list에서 max 찾고 그 지점까지 원소들을 다 지워주는 함수 만듦
→ 그리고 빈 리스트가 될 때까지 함수 무한반복
그래서 만들었다.
def find_max(b):
for i in range(arr.index(max(arr))+1):
b+=(max(arr) - arr[0])
del(arr[0])
return b
T=int(input())
for t in range(1,T+1):
N =int(input())
arr=list(map(int,input().split()))
profit=0
while True:
profit = find_max(profit)
if arr== []:
break
print('#{} {}'.format(t,profit))
이거 10개의 테스트 중에 7개는 맞는다.
근데 8번째부터는 데이터 크기가 어마어마하게 커지기 때문에 '제한시간 초과' 에러가 뜬다.
다른 방법을 찾아야했다.
댓글을 보는데 뒤에서부터 풀어야한다는 이야기가 많았다.
근데 어떻게 뒤에서부터 푸는지 감이 안 왔다...
문제를 거꾸로 생각하라는 뜻인지, 인덱싱을 뒤에서부터 하라는 의미인건지.
한참을 고민하다가 모범답안을 봤다.
여기서 모범답안이란 python으로 푼 답들 중 실행시간이 제일 짧은 답을 의미한다.
모범답안 (박주윤_0715755)
- 202,440 kb메모리
- 873 ms실행시간
T = int(input())
for test_case in range(1, T + 1):
inputa = int(input())
inputb = input()
ls = [ int(i) for i in reversed(inputb.split(' ')) ]
max = 0
sum = 0
for i in ls:
if max<i:
max=i
sum+=max-i
print(f'#{test_case} {sum}')
진짜 이마를 탁 쳤다.
뒤에서 풀라는 게 이런 의미였다니..
어차피 가장 큰수,..... ,두번째로 큰 수,..... ,세번째로 큰 수, ..... 이렇게 배열된다.
이걸 reverse하면 max를 계속 업데이트하며 max에서 그 원소만큼을 계속 sum에 더해주면 된다.
이런게 생각의 전환일까?
정말정말 대단하다.
이렇게 이해를 마치고 나서 모범답안을 보지 않고 스스로 코드를 짜봤다.
- 250,964kb메모리
- 1,101ms실행시간
T = int(input())
for t in range(1,T+1):
N =int(input())
arr=list(map(int,input().split()))
profit=0
max = 0
for i in range(N-1,-1,-1):
if arr[i]> max:
max = arr[i]
profit += max - arr[i]
print("#{} {}".format(str(t),str(profit)))
원리는 모범답안과 다르지 않다.
다만 reverse를 하지 않고 index로 뒤에서부터 인덱싱 해줬다.
근데 메모리, 실행시간을 비교해보면 reverse를 하고 원소 하나하나로 for문을 작성하는게 메모리나 실행시간면에서 더 효율적인 것 같다.
정말 어려웠던 문제다.
'Python' 카테고리의 다른 글
220123 학습일기 (0) | 2022.01.23 |
---|---|
220120 학습일기 (0) | 2022.01.20 |
220117 학습일기 (0) | 2022.01.18 |
220116 학습일기 (0) | 2022.01.16 |
220115 학습일기 (0) | 2022.01.15 |