Coding History

2024. 07 .01 문제풀이

BlackBirdIT 2024. 7. 1. 18:22

문제다.

//머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
//구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.
public class Main {
    public static void main(String[] args) {
    }
}
class Solution {
    public int solution(int price) {
        int sale;
        if (price >= 100000 && price < 300000){
            sale = price / 100;
            price -= sale*10;
        }
        if (price >= 300000 && price < 500000){
            sale = price / 100;
            price -= sale*20;
        }

        return price;
    }
}

일단 이건 정답이 아니고 평균치를 구해서 10퍼나 20퍼를 원래 가격에서 빼는 식으로 하려고 하는데 뭔가 잘못되었나보다.

아니다. 100,000일땐 90,000으로 잘 나오는 것 보니 디버그를 좀 돌려봐야될 것 같다.

아 문제를 잘못 읽었구나 10만원 이상에서 30만원까지는 5프로 할인이다. 다시 수정해보자

class Solution {
    public int solution(int price) {
        int sale;
        if (price >= 100000 && price < 300000){
            sale = price / 100;
            price -= sale*5;
        }
        if (price >= 300000 && price < 500000){
            sale = price / 100;
            price -= sale*10;
        }
        if (price >= 500000){
            sale = price / 100;
            price -= sale*20;
        }

        return price;
    }
}

테스트 케이스는 다 통과한다.

아 제출하니까 몇가지가 틀려서 else if 로 수정해 보았다.

그래도 안되네.. 소수점이 문제인건가? 나눌 때 버려지는 소수점 때문에 문제가 생기는걸까?

그럼 소수점으로 할인률을 곱하고 return값을 int로 형변환 해보자.

class Solution {
    public int solution(int price) {
        if (price >= 100000 && price < 300000) {
            price -= price * 0.05;
        } else if (price >= 300000 && price < 500000) {
            price -= price * 0.1;
        } else if (price >= 500000) {

            price -= price * 0.2;
        }
        return (int) price;
    }
}

바로 값을 구하면서 필요없어진 sale 변수는 지웠다.

오케이 이렇게 하니까 통과된다! 아마도 소수점으로 가면서 누락되는 데이터 때문에 몇가지 테스트 케이스에서 걸렸나보다. 다른 사람 답도 궁금하니 한번 보자.

class Solution {
    public int solution(int price) {
        int answer = 0;

        if(price>=500000) return (int)(price*0.8);
        if(price>=300000) return (int)(price*0.9);
        if(price>=100000) return (int)(price*0.95);

        return price;
    }
}

이게 제일 인상적이다. 높은 값 부터 계산해서 바로 할인된 값을 도출하고 거기에 바로 형변환.. 높은 할인률부터 계산하니까 조건문을 더 짧게 쓸 수 있는데다 계산하는 것도 바로 할인된 값을 도출 할 수 있는데 난 왜 할인률을 구해서 빼야된다고만 생각했을까. 역시 아직 멀었다.