프로그래머스lv1 정답률77% 부족한금액계산

BABY CAT·2022년 10월 9일
0

coding test

목록 보기
9/17
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로 나누면 3030 나왔네
        
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위 정답 같은데

0개의 댓글