본문 바로가기

프로그래머스 위클리 챌린지 1주차

programmers code review/_step1 2021. 8. 23.
728x90

프로그래머스 1단계 Java 위클리 챌린지 1주차 부족한 금액 계산하기 문제입니다.


문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N번째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

 

제한사항

  • 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
  • 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
  • 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

 

입출력 예

price money count result
3 20 4 10

입출력 예 설명

입출력 예 #1
이용금액이 3인 놀이기구를 4번 타고 싶은 고객이 현재 가진 금액이 20이라면, 총 필요한 놀이기구의 이용 금액은 30 (= 3+6+9+12) 이 되어 10만큼 부족하므로 10을 return 합니다.

 

문제 해결 방법

① 자료형 int로는 담을 수 없는 큰 수의 계산이 필요하므로 자료형 long으로 선언

② 이용 횟수 count만큼 증가하는 이용금액 price를 현재 소지금에서 차감

③ 이용 횟수만큼 반복차감한 현재 소지금 비교

    양수일 경우 ▶ 돈이 부족하지 않으므로 0 반환

    음수일 경우 ▶ 부족한 금액은 음수이므로 절대값 반환(연산자 ' - ' 를 붙여도 무관)


더보기
class Solution {
    public long solution(int price, int money, int count) {
        // ① 자료형 int로는 담을 수 없는 큰 수의 계산이 필요하므로 자료형 long으로 선언
        long temp = money;
        for (int i = 0; i < count; i++) {
         	// ② 이용 횟수 count만큼 증가하는 이용금액 price를 현재 소지금에서 차감
        	temp -= price * (1 + i);
        }
        /*
        ③ 이용 횟수만큼 반복차감한 현재 소지금 비교
        양수일 경우 ▶ 돈이 부족하지 않으므로 0 반환
        음수일 경우 ▶ 부족한 금액은 음수이므로 절대값 반환(연산자 ' - ' 를 붙여도 무관)
        */
        return temp >= 0 ? 0 : Math.abs(temp);
    }
}

다른 문제 해결 방법

위 문제는 이용 횟수에 따라 이용가격이 균일하게 증가하는 등차수열문제로 이해하게되면 문제가 더욱 간단해집니다.

첫번째 항, N번째 항, 공차가 모두 문제에 주어져 있으므로 등차수열의 합 공식을 이용하면 됩니다.

 

등차수열의 합 공식

등차수열의 합 공식은 다음과 같습니다. 공식 유도 과정은 생략하겠습니다. 궁금하신 분들을 위해 게시글의 링크부분에 올려놓도록 하겠습니다.


n = 횟수, a₁ = 초항, an = n번째 항

또는

n = 횟수, a₁ = 초항, an = n번째 항, d = 공차


더보기
class Solution {
    public long solution(long price, long money, long count) {
    	return Math.max(price * (count * (count + 1) / 2) - money, 0);
    }
}

더보기
class Solution {
    public long solution(long price, long money, long count) {
    	return Math.max((count * (2 * price + (count - 1) * price)) / 2 - money, 0);
    }
}

 

※ 삼항연산자

③ 의 반환값은 삼항연산자로 값을 정하게 되는데, if/else 문과 매우 흡사하여 코드가 간결해지는데에 도움이 됩니다.

삼항연산자 사용법은 다음과 같으며, 참 또는 거짓의 값을 반드시 반환하는 것이 if/else 문과의 차이점입니다.

Condition ? TRUE : FALSE

if/else 문에 비해 구문이 간단하다해서 속도가 빠른 것은 아닙니다.

 

※ 위 코드는 해결 방법 중 한가지이며 더 효율적인 코드가 있을 수 있습니다.

 

문제 풀어보기 ▶ https://programmers.co.kr/learn/courses/30/lessons/82612?language=java
 

코딩테스트 연습 - 1주차

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

programmers.co.kr

 

등차수열 합 공식 유도 과정 보기 ▶ https://ko.wikipedia.org/wiki/등차수열
 

등차수열 - 위키백과, 우리 모두의 백과사전

수학에서, 등차수열(等差數列, 문화어: 같은차수렬, 영어: arithmetic progression, AP 또는 arithmetic sequence)은 연속하는 두 항의 차이가 모두 일정한 수열을 뜻한다. 예를 들어 1, 3, 5, 7, 9, ...은 등차수열

ko.wikipedia.org

'programmers code review > _step1' 카테고리의 다른 글

수박수박수박수박수박수?  (0) 2021.08.24
프로그래머스 위클리 챌린지 2주차  (0) 2021.08.23
문자열을 정수로 바꾸기  (0) 2021.08.17
시저 암호  (0) 2021.08.17
약수의 합  (0) 2021.08.17

댓글