https://school.programmers.co.kr/learn/courses/30/lessons/82612
프로그래머스lv1 정답률77% 부족한금액계산
이 놀이기구의 원래 이용료는 price원 인데,
놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다
처음 이용료가 100
2번째에는 200,
3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 # return
#def solution(price, money, count):
#price money count result
#3 20 4 10
=============================================
#변수선언
price=3
money=20 가지고 있는 돈
count=4
#result=10
이용금액은 3 6 9 12 이렇게 늘어난다
리턴은 부족한 돈
일단 이용금액
price*1 + price*2 + price*3 + price*4
에서
price*1 + price*2 + ... + price*count
숫자를 i로 주고 스택 누적
nm = 0
for i in range(1,count+1):
nm += price*i
print(nm)
정리
price=3
money=20
count=4
#result=10
nm = 0
for i in range(1,count+1):
nm += price*i
print(nm)
출력은 30 이니까 모자란 돈 10이니까 올바른 코드 완성
nm에서 머니를 빼주는 코드
price=3
money=20
count=4
#result=10
nm = 0
for i in range(1,count+1):
nm += price*i
print(nm-money)
다음은 함수로 바꾸고 리턴으로
def solution(price, money, count):
nm = 0
for i in range(1,count+1):
nm += price*i
return nm-money
print(solution(3,20,4))
출력10
프로그래머스 테스트 ㄱ
정확성 95.7%로 아큐먼트 하나를 실패했다
이유가?
제한사항을 확인해보자
놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수
모르겟다
그냥값을 넣어보자
1. price에 1을 넣으면 -10 이 나온다
2. 머니는 상관 없는 것 같고
3. 카운트에 1 넣으면 -17이 나온다
즉 마이너스 값이 나올 때 실패로 뜨는 것 같은데
-값이 나온다면 돈이 부족하지 않는 거니까
-가 나오면 0으로 바꿔줘야 한다는 말이다 ㅇㅇ
다시 코드를 보자
def solution(price, money, count):
nm = 0
for i in range(1,count+1):
nm += price*i
return nm-money
리턴 전에 이프만 하나 걸면 끝나겠다
나의 풀이 def solution(price, money, count): nm = 0 for i in range(1,count+1): nm += price*i if nm-money < 0 : return 0 else: return nm-money
100% 성공
좋아요 1위 정답을 보자
def solution(price, money, count):
return max(0,price*(count+1)*count//2-money)
3,6,9,...을 수열이라 보고 등차수열의 합
을 이용한 거라는데 모르겠다
등차수열 공식 기억도 안나는데.. 검색을 해보자
등차수열의 합
첫 항과 마지막 항을 더한 뒤 항의 개수를 곱하고 2로 나눈 값
그럼
price=3
money=20
count=4
에서
첫항은 3 마지막항은 12 더하면 15
항의 개수는 4니까 곱하면 60
2로 나누면 30
헉 30 나왔네
price*(count+1)*count//2-money 을 다시 보자
price=3
money=20
count=4
에서
price price*count
이게 첫항이고 마지막항은
더하면
price + (price*count) 이고 항의 개수는 count니까 곱하면
price*count + (price*count)*count 이고
여기서 2로 나누면
( price*count + (price*count)*count ) // 2
출력하면 30 이 나온다 여기서 머니를 빼야하니까
( price*count + (price*count)*count ) // 2 -money
하면 10이 나온다
price*(count+1)*count//2-money
을 풀어쓰면
(price*count + price )*count//2-money
(price*count*count + price*count) // 2 -money
니까
( price*count + (price*count)*count ) // 2 -money
랑 같다
즉
def solution(price, money, count):
return max(0,price*(count+1)*count//2-money)
는 등차수열의합에서 머니를 뺀 값인데
여기서 max(0, )은 왜 붙인 걸까
맥스함수를 빼니까 정확도 검사에서 하나가 틀린다.
아 마이너스 값이 나오면 0으로 리턴하는 거다.. 내가 겪은 시행착오처럼.
맥스로 0을 리턴하는 기발한 발상이다
3 6 9 를 보고 등차수열이라는 걸 생각했어야 했다.
그럼 맥스만 빼면 이 정도는 나도 할 수 있는 1위 정답 같은데