프로그래머스 level 1에 '치킨 쿠폰' 문제를 풀다가 실행 시간이 길어 작동이 되지 않는 내 코드를 갖고 끙끙대다가.. 알고리즘 시간을 단축시키기 위한 방법에 대해 알게 되었다
프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
위 문제를 해결하기 위해 내가 짠 코드는 다음과 같다
function solution(chicken) {
let coupon = 0;
while (chicken >= 10) {
coupon += parseInt(chicken / 10);
chicken = coupon + (chicken % 10);
}
return coupon;
}
coupon
이라는 변수를 생성chicken
의 값이 10보다 큰 동안은 계속해서 coupon
변수에 parseInt(chicken / 10)
의 값을 누적해서 합산하도록 함 (10마리 시킬 때마다 1장씩 받으니까 - 예) chicken = 180 -> 180 / 10 = 18
)chicken
의 값은 10마리당 1장씩 받는 coupon
의 값 + 10마리를 시켜서 쿠폰을 받고 남은 나머지 값 을 합산해서 할당해준다 (10보다 작아질 때까지)coupon
은 coupon
1장으로 chicken
1마리를 시킬 수 있으니까 = chicken
1마리로 침)예) chicken = 181 -> 181 % 10 = 1
=> coupon
10장 받고,chicken
시켜먹은 기록 1마리 남음)coupon
값에 반복적으로 값을 할당하는 것보다 새로운 변수를 도입하는 게 더 낫다는 것..!function solution(chicken) {
let coupon = 0;
while (chicken >= 10) {
const newCoupon = parseInt(chicken / 10);
coupon += newCoupon;
chicken = newCoupon + (chicken % 10);
}
return coupon;
}
coupon
이라는 값을 while
문 안에 넣어서 반복적으로 값을 대입하는 것보다 newCoupon
이라는 새로운 변수를 생성해서 값을 할당하는 게 더 효율적이라는 것. 근데 이유를 잘 모르겠어서 찾아보니 다음과 같다.
💡 두 코드의 주요한 차이점은 변수 업데이트 부분
- 원래 코드는
coupon
변수를 직접 업데이트하고chicken
변수를 계산하여 다시 대입한다.- 수정된 코드에는
newCoupon
이라는 새로운 변수를 도입하여 쿠폰의 발급 개수를 계산하고,coupon
변수에 누적시킨다. 그리고chicken
변수를 업데이트할 때는newCoupon
값과chicken
의 남은 개수를 더한다.
-> 수정된 코드에서newCoupon
변수를 사용하여 쿠폰의 발급 개수를 계산하고 누적시키므로,coupon
변수를 직접 업데이트하는 것보다 연산이 간단해진다.
->chicken
변수의 값이 매번 바뀌면서 반복분의 횟수가 증가하는 것을 방지할 수 있다. 즉,chicken
변수의 값이 적절하게 업데이트되면서 불필요한 반복을 줄일 수 있게 되는 것.
-> 또한, 원래 변수를 직접 업데이트하는 방식은 변수를 잘못 사용하거나 계산 실수를 할 수 있는 가능성을 고려하지 않기 때문에 오류에 취약하는 점도 있다.
요약하면, 새로운 변수를 도입하여 원래 변수의 값을 누적시키는 것은 코드의 가독성, 단순성, 실행 횟수, 오류 방지 측면에서 효율적인 방법! 이를 통해 코드의 성능과 실행 시간을 개선할 수 있다. 📝