본문 바로가기

IT Tech/Dev-Practice

프로그래머스 위클리 챌린지 1주차 - 부족한 금액 계산하기

반응형

https://programmers.co.kr/learn/courses/30/lessons/82612?language=java 

 

코딩테스트 연습 - 1주차

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이

programmers.co.kr

조금만 생각하면 해당 문제는 등차수열의 합을 이용하여 계산할 수 있다.

 

  1. 요금 + 요금*2 + 요금*3 .... 요금*n
  2. 등차수열의 합 공식
    a : 첫째항, l : 끝항, n : 개수
    n * (a +l) / 2
  3. 횟수에 따른 전체 내어야 할 요금
    price*(1+count)*count/2

 

계산은 단순할지 모르나 이렇게만 하면 테스트케이스에서 오류가 발생하게 된다.

여기서 추가적으로 더 알아야 할 문제가 있는데

  1. 초기 입력값에 대한 Validation
  2. 큰 수에 대한 처리 (int의 범위를 넘어설때)

 

위 사항은 어느 알고리즘 기반의 테스트를 하더라도 다 확인해야 할 문제이다.

초기 입력값 확인은 아래와 같이 별도 처리를 하면 되고, 큰 수의 경우 long으로 처리될 수 있도록 수식을 작성하면 된다.

 

 

아래는 정답 예시

Stream을 이용해서 sum을 구할순 있으나 성능이 떨어짐.

public class WeeklyChallange08_1 {

	public static void main(String[] args) {
		int price = 2500;
		int money = 1;
		int count = 2500;
		long insufficienMoney = new WeeklyChallange08_1().solution(price, money, count);
		System.out.println("insufficienMoney > "+insufficienMoney);
	}
	
	public long solution(int price, int money, int count) {
		if(price < 1 || price > 2500) {return -1;}
		if(money < 1 || money > 1000000000) {return -1;}
		if(count < 1 || count > 2500) {return -1;}
		
		// 등차수열의 합
		long insufficientMoney = money-(price*(1L+count)*count/2L); 
		//long insufficientMoney = money - (price * LongStream.rangeClosed(1, count).sum());
		return insufficientMoney>0?0:Math.abs(insufficientMoney);
    }

}
반응형

'IT Tech > Dev-Practice' 카테고리의 다른 글

[java] 피보나치 수열 구현  (0) 2020.10.02