본문 바로가기
개발/개발 공부

[프로그래머스] 코딩테스트 입문 : 옷가게 할인 받기

by 하모예 2024. 8. 30.

| 문제

머쓱이네 옷가게는 10만원 이상 사면 5%, 30만원 이상 사면 10%,

50만원 이상 사면 20%를 할인해 줍니다. 

구매한 옷의 가격 price가 주어질 때,

지불해야 할 금액을 return 하도록 solution 함수를 완성해 보세요.

| 제한 사항

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

| 입출력 예

price result
150,000 142,500
580,000 464,000

| 풀이 1

public int solution01(int price) {
    double answer = 0; 
    if(0 < price && price < 100000){
        answer = price;
    } else if(100000 <= price && price < 300000){
        answer = price * 0.95;
    } else if(300000 <= price && price < 500000){
        answer = price * 0.9;
    } else if(500000 <= price){
        answer = price * 0.8;
    }
    return (int)answer;
}

| 풀이 2

public int solution02(int price) {
    double answer = 0; 
    if(price >= 500000){
        answer = price * 0.8;
    } else if(price >= 300000){
        answer = price * 0.9;
    } else if(price >= 100000){
        answer = price * 0.95;
    } else{
        answer = price;
    }
    return (int)answer;
}

| 해설

옷가게 할인 받기 문제의 조건을 표로 그려보면 아래와 같아요.

조건문의 범주가 점이 아니라 선이기 때문에 switch문 대신 if문을 사용해야 합니다. 

그리고 풀이 1과 같이 코드를 작성하면 됩니다.

범주 0원 ~ 10만원 미만 10만원 이상 ~ 30만원 미만 30만원 이상 ~ 50만원 미만 50만원 이상 ~
할인율 0% 5% 10% 20%

하지만, 여기서 한번 더 나아가볼까요?

자바는 파이썬과 다르게 비교 연산자를 연속해서 작성할 수 없습니다. 

0원에서 10만 원 미만이라면 우리 생각으로는 0 ≤ price ≤ 1000000로 표현할 수 있을 것 같지만

2개의 부등호가 하나의 조건식에 연속해서 올 수 없으므로 불가능합니다.

이럴 때는  0 ≤ price && price ≤ 1000000와 같이 논리 연산자를 사용하여 처리해줘야만 합니다.

그러다 보니 풀이 1과 같이 복잡한 모양의 조건식이 도출되게 되지요.

어떻게 보면 친절해 보이는 코드지만 사실 불필요한 연산이 포함되어 있습니다.

 

if~else if~else문이 가지는 특징을 이용해서 코드를 간소화해 봅시다.

if문은 코드가 위에서부터 아래로 순차적으로 실행됩니다.

if문의 결과가 true이면 블록 안의 코드가 실행되고 중단하게 되고,

if문의 결과가 false일 경우만 else if 또는 else문에 도달하게 되지요.

다시 말해서 두 번째 else if문에 도달했다는 것은

첫 번째 if문의 조건식이 false인 조건에 부합한다는 뜻이 됩니다.

 

풀이 2에서 처럼 if문의 조건식에 50만 원 이상을 적게 되면

자연스레 두 번째 else if는 50만원 미만 조건이 성립하게 됩니다.

실질적으로 수식에 적힌 것은 30만 원 이상이지만 

결론적으로 30만원 이상, 50만 원 미만의 조건에 부합하게 되는 거죠.

 

이런 식으로 코드를 고치면 풀이 1보다 훨씬 더 깔끔한 코드가 나오게 됩니다. 

물론 풀이 2가 풀이 1보다 덜 직관적이므로 두 가지 중에 선택하시면 됩니다.

그렇지만 할 수 있는데 안 하는 것과 할 줄 몰라서 못하는 것은 다르니

한 번쯤은 다른 방향으로 생각해 보는 연습을 하셨으면 좋겠습니다.

프로그래밍을 할 때는 위, 아래, 좌, 우를 모두 바꿔가면서 다각도로 생각해 보세요.

절대 해결되지 않을 것 같은 문제가 생각보다 쉽게 해결되는 걸 확인하실 수 있을 거예요.

댓글