옷가게 할인 받기
https://school.programmers.co.kr/learn/courses/30/lessons/120818
구매 금액 price 에 따라 할인율을 적용한 최종 금액을 반환하는 문제이다.
구매 금액이 10만원 이상 시 5% 할인 / 30만원 이상 시 10% 할인 / 50만원 이상 시 20% 를 할인받는다.
내가 작성한 풀이는 이렇다.
각 조건에 맞는 할인가를 구한 후 ( 가격 x 할인율 ) , 가격에서 할인가를 뺀 값을 반환하면 될 것이라 판단했다.
using System;
public class Solution
{
public int solution(int price)
{
int discount = price >= 500000 ? price * 20 / 100 :
price >= 300000 ? price * 10 / 100 :
price >= 100000 ? price * 5 / 100 : 0;
return price - discount;
}
}
여기서 삼항연산자보다는 If 문을 사용하는게 좋은 방법인데, 굳이 삼항연산자를 사용한 이유는 평소 잘 쓰지 않는 키워드들을 자주 사용하면서 친숙해지기 위해 삼항연산자를 사용했다.

내가 보기에는 코드에는 문제가 없어보이고, 할인율도 잘 적용되고 최종 금액도 반환하는 것처럼 보인다.
하지만 채점에서 통과가 되지 않았다. Big - O 값이 너무 느린가? 그렇다기에는 O(1) 상수시간으로 빠른데, 다른 쪽에서 문제가 있는걸까?
채점에서 실패한 원인 분석

문제는 소수점 버림이 너무 일찍 발생한다는 점이었다.
예를 들어 price 가 100001 이라고 가정한다.
100001 원의 5% 할인 금액은 다음과 같다.
100001 * 0.05 = 5000.05
하지만 처음 풀이에서는 int 계산을 사용했기 때문에 소수점 이하가 버려진다.
5000.05 → 5000
그래서 최종 금액은 이렇게 계산된다.
100001 - 5000 = 95001
하지만 실제로 문제에서 원하는 계산은 할인 적용 후 최종 금액의 소수점을 버리는 것이다.
100001 * 0.95 = 95000.95
95000.95 → 95000
정답은 95000 이어야 하는데 처음 코드는 95001 을 반환하게 된다.
수정한 풀이 코드
그래서 할인 금액을 따로 구하지 않고 , 최종 결제 비율을 곱한 뒤 마지막에 한 번만 정수로 변환했다.
using System;
public class Solution
{
public int solution(int price)
{
double rate = price >= 500000 ? 0.8 :
price >= 300000 ? 0.9 :
price >= 100000 ? 0.95 : 1.0;
return (int)(price * rate);
}
}
이렇게 하면 할인 적용 후의 최종 금액을 먼저 계산하고 , 마지막에 소수점 이하를 버리게 된다.
다른 풀이
▼ 형변환 없음
using System;
public class Solution
{
public int solution(int price)
{
int result = price >= 500000 ? price * 80 / 100 :
price >= 300000 ? price * 90 / 100 :
price >= 100000 ? price * 95 / 100 : price;
return result;
}
}
▼ float 으로 최종 금액 계산 후 버림
using System;
public class Solution
{
public int solution(int price)
{
float offPrice = price;
if (price >= 500000) offPrice = price - (price * 0.2f);
else if (price >= 300000) offPrice = price - (price * 0.1f);
else if (price >= 100000) offPrice = price - (price * 0.05f);
return (int)offPrice;
}
}
정리
이 문제는 단순히 할인율을 적용하는 문제처럼 보이지만 , 실제로는 정수 계산과 소수점 버림 위치를 주의해야 하는 문제였다.
다음 차이를 기억해야 한다.
price - (int)(price * 0.05)
(int)(price * 0.95)
위 두개의 코드는 항상 같은 결과가 나오지 않는다.
소수점 버림은 최대한 늦게 , 딱 한 번만 해야 한다.
중간 계산에서 int 나눗셈이 일어나면 소수점이 손실되어 오답이 발생한다.
할인 금액을 먼저 구하지 말고 , 최종 금액에 직접 비율을 곱한 뒤 버려야 한다.
이번 문제를 통해 중간 계산에서 소수점을 버리면 최종 결과가 달라질 수 있다는 점을 배웠다.
'📖TIL > ✅CodingTest' 카테고리의 다른 글
| 두 숫자를 비교하는 내장 메서드 (0) | 2026.06.09 |
|---|---|
| 문자열 순회하며 교체하기 (0) | 2026.06.03 |
| 문자 리스트를 문자열로 변환 (0) | 2026.05.29 |
| 숨어있는 숫자의 덧셈 (0) | 2026.05.16 |
| 문자열 패딩 ( Padding ) (0) | 2026.05.14 |