본문 바로가기

Coding Test/Programmers

[프로그래머스/JavaScript] 코딩 테스트 풀이 (문제 32 - 옷가게 할인 받기)

728x90

 

# 문제 

머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.



# 답안 

// 1. 입력: price -> 10원 단위 정수 10, 20, 100, 1000 같은거
// 2. 출력: price가 10만 이상이면, price의 95% 반환
// price가 30만 이상이면, price의 90% 반환
// price가 50만 이상이면, price의 80% 반환

function solution(price) {
    if(price >= 500000){
        return Math.floor(price * 0.8)
    }
    if(price >= 300000){
        return Math.floor(price * 0.9)
    }
    if(price >= 100000){
        return Math.floor(price * 0.95)
    }
    return price
}

 

 

# 인사이트 

1. 가격 범위에 대한 순서를 잘 고려해서 작성해야함 
- 가장 큰 가격 범위부터 시작하여 작은 가격 범위 순서로 조건문을 작성해야 한다.
- 즉, 가장 큰 가격 범위를 먼저 확인하고, 그 이후에 작은 가격 범위들을 확인하도록 코드를 재구성해야 한다.
- 작은 가격 범위부터 시작하여 큰 가격 범위 순서로 작성하게 되면, 가격 범위가 겹치는 경우에는 상위 범위가 먼저 처리되기 때문이다. (예컨대, 가격이 500,000원 이상인 경우에 300,000원 이상과 100,000원 이상의 조건문이 모두 참이 되어 잘못된 결과가 반환됨)


2. 여기서 Math.floor() 함수를 써야하는 이유
- 주어진 코드에서는 가격에 대한 할인을 적용한 후 Math.floor() 함수를 사용하여 소수점 이하를 버리고, 최종 가격을 정수로 반환하고자 한다.
- 이렇게 하면 할인된 가격이 소수점 이하로 표시되지 않고 정수로 표현되는 것이다. 
- 주어진 코드에서 Math.floor() 함수를 사용하지 않아도 결과는 동일할 수 있다. 
- 그러나 할인된 가격이 소수점 이하를 가지는 경우가 발생할 수 있다. 
- 예를 들어, 500,000 원의 가격에 20%의 할인을 적용한 경우 400,000 원이 되어야 하지만 Math.floor()를 사용하지 않으면 400,000.0이 아닌 400,000.00000000006과 같이 소수점 이하가 표시될 수 있다. 
- 이는 부동소수점 연산의 한계로 인해 발생하는 것이다.


3. 코드의 가독성과 명확성을 위해 명시적으로 return 문을 작성하는 것이 좋다. 


4. 정확한 결과를 얻기 위해서는 else if나 else를 사용하여 각 조건에 대한 상호배타적인 처리를 하는 것이 좋다.

 

 

 

728x90