[JS] 할인된 가격 구하기

김zunyange·2023년 6월 7일
0

알고리즘

목록 보기
3/7
post-thumbnail

문제 설명

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

제한 사항

  • 10 ≤ price ≤ 1,000,000
    • price는 10원 단위로(1의 자리가 0) 주어집니다.
  • 소수점 이하를 버린 정수를 return합니다.

입출력 예

priceresult
150,000142,500
580,000464,000

내 풀이법

할인율 기준이 3개뿐이여서 if 문을 써도 나쁘지 않다고 판단했다.
하지만 테스트 2개가 통과가 안되었고 🥲

우선 15만원일 때와 , 38만원일 때는 테스트가 확실하게 통과됐으니

    if (price >= 100000 && price < 300000) {
        return price*0.95;
    } 

    else if (price >= 500000) {
        return price*0.8;

두 조건문은 문제가 없어보인다.
확실하지 않지만 일단 남은 두 조건문에 오류가 있는지 살펴봤고, 첫 else-if 문은 if 문에 이어진 코드라 문제가 없을 것으로 예상한다. 그래서 else 문을 고쳐보기로 한다.

//1
else {
  return parseInt(price);
  
//2
else {
  return Math.floor(price);

다 해봤지만 else 인 경우는 이미 price 그 자체이기 때문에 정수로 변환해줄 필요가 없다. 그렇다면 왜 자꾸 2가지에는 안되는 것인가!! 고민고민고민 ...

분명 제한사항에 소수점 이하를 버린 정수를 return 하란 말에는 의미가 있을 것이다. 만약 123450원 이라면 123450*0.95=117277.5 !!!!!!!!!!!!
그러므로 여기에 정수변환 메서드를 써야했던 것이다.

최종 풀이법

function solution(price) {

    if (price >= 100000 && price < 300000) {
        return Math.floor(price*0.95);
    } else if (price >= 300000 && price < 500000) {
        return Math.floor(price*0.9);
    } else if (price >= 500000) {
        return Math.floor(price*0.8);
    } else {
        return price;
    }
    
}

헉 14점이나 받았다.
좋은 코드라고는 생각안하는데 왜지 ? 이렇게 큰 점수가 있을 줄이야 ..


보통 나는 if문이나 for문으로 자주 풀어서 다른 분들의 풀이를 봤을 때 눈이 번쩍 뜨이는 풀이법들이 많은데, 이번 문제는 대부분 if문으로 풀었고, 삼항연산자도 몇 있었지만 코드가 한줄에 너무 길어져서 이 경우에는 if문이 맞다고 본다! 기발한 풀이법이 딱히 없어서 후한 점수를 받은 듯 하다.
그리고 오늘도 tilde 연산자 발견!

다른 분들의 풀이(1)

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

큰 수부터 조건문을 걸어두면 나처럼 &&연산자를 사용하지 않고 + return 문을 삭제해서 차근차근 조건을 내려올 수 있도록 하면 된다.
🪄 if문의 작동 방법을 유의할 것

다른 분들의 풀이(2)

function solution(price) {
    price = price>=500000?price*0.8:price>=300000?price*0.9:price>=100000?price*0.95:price;
    return ~~(price);
}

~~ 연산자(tilde)는 비트 단위 NOT 연산자를 두 번 적용하는 것으로, 주어진 수를 소수점 이하를 버리고 정수형으로 변환하는 역할을 한다. 이 연산자는 다른 연산자보다 빠르게 동작하기 때문에 속도가 중요한 연산에서 자주 사용된다고 한다.

profile
배움은 즐거워 ~(*ૂ❛ᴗ❛*ૂ)

0개의 댓글