옷가게 할인 받기

2026. 6. 1. 03:40·📖TIL/✅CodingTest

옷가게 할인 받기

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
'📖TIL/✅CodingTest' 카테고리의 다른 글
  • 두 숫자를 비교하는 내장 메서드
  • 문자열 순회하며 교체하기
  • 문자 리스트를 문자열로 변환
  • 숨어있는 숫자의 덧셈
DevHoChan
DevHoChan
맨땅에서 시작하는 코딩 도전
  • DevHoChan
    Debugging Life
    DevHoChan
  • 전체
    오늘
    어제
    • 분류 전체보기 (374)
      • 🕹️Game Life (1)
      • 🖥️Computer Science (5)
      • 📖TIL (141)
        • 🔥Projects (16)
        • 💡DevTips (5)
        • 🤔발생한 문제와 해결 (5)
        • 🔮Unity Graphics (5)
        • 🎤Interview (3)
        • ✅CodingTest (9)
      • 🚀Game Release (4)
      • 🧊Unity Basic (58)
        • 📌용어 사전 (1)
        • 에디터&인터페이스 (3)
        • 디버그 (1)
        • 라이프사이클 (4)
        • 게임오브젝트 (4)
        • 프리팹 (1)
        • 오브젝트풀링 (4)
        • 애트리뷰트 (2)
        • 트랜스폼 (4)
        • 물리&충돌 (1)
        • 프레임&델타타임 (4)
        • 코루틴&이벤트 (7)
        • 수학&보정함수 (3)
        • 디자인패턴 (9)
        • UGUI (3)
        • 벡터 ( Vector ) (3)
        • 씬 ( Scene ) (2)
        • 데이터 관리 (2)
      • ⭐C Sharp (99)
        • 📌용어 사전 (1)
        • 📌문법 사전 (6)
        • 메모리 관리 (3)
        • 00. 문법 (17)
        • 01. 변수 (3)
        • 02. 자료형 (2)
        • 03. 연산자 (6)
        • 04. 조건문 (2)
        • 05. 반복문 (2)
        • 06. 배열 (3)
        • 07. 메서드(함수) (7)
        • 08. 열거형 (3)
        • 09. 구조체 (2)
        • 10. 참조 (2)
        • 11. 객체 지향 (11)
        • 12. 델리게이트 (3)
        • 13. 디자인 패턴 (7)
        • 14. LINQ (1)
        • 📂▼자료구조 (2)
        • 15-1. 제네릭 (3)
        • 15-2. 배열 (4)
        • 15-3. 리스트 (2)
        • 15-4. 스택과 큐 (2)
        • 15-5. 딕셔너리 해시테이블 (2)
        • 15-6. 트리와 그래프 (3)
      • 📊Algorithm (16)
        • BigO (2)
        • 정렬 (4)
        • 셔플 (2)
        • 탐색 (6)
        • 최적화 (1)
      • 📝Game Design (16)
      • 🤖​AI Tools (12)
        • AI 리뷰 분석 (6)
        • Player2 (0)
        • 3D 모델링 (1)
        • 2D 스프라이트 (0)
        • 이미지 (2)
        • 사운드 (1)
        • 동영상 (1)
        • 문서 (1)
      • 🌍Network (6)
      • 🌱Github (11)
        • 기본 개념 (7)
        • 명령어 (1)
        • 도구 활용 (1)
      • ⚙️Visual Studio (5)
        • 🔧설치 및 환경설정 (2)
        • ⌨️HotKey (1)
        • 🚨디버깅 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자료형
    csharp
    algorithm
    유니티
    기획
    자료구조
    unity
    til
    디자인패턴
    게임기획
    문법
    메모리관리
    게임디자인
    OOP
    CodingTest
    GitHub
    c#
    부트캠프
    gamedesign
    객체지향
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
DevHoChan
옷가게 할인 받기
상단으로

티스토리툴바