[프로그래머스-기초] 커피 심부름

JiEun·2024년 1월 19일
0

코테/코플릿

목록 보기
53/56

커피 심부름

문제 설명

팀의 막내인 철수는 아메리카노와 카페 라테만 판매하는 카페에서 팀원들의 커피를 사려고 합니다. 아메리카노와 카페 라테의 가격은 차가운 것과 뜨거운 것 상관없이 각각 4500, 5000원입니다. 각 팀원에게 마실 메뉴를 적어달라고 하였고, 그 중에서 메뉴만 적은 팀원의 것은 차가운 것으로 통일하고 "아무거나"를 적은 팀원의 것은 차가운 아메리카노로 통일하기로 하였습니다.

각 직원이 적은 메뉴가 문자열 배열 order로 주어질 때, 카페에서 결제하게 될 금액을 return 하는 solution 함수를 작성해주세요. order의 원소는 아래의 것들만 들어오고, 각각의 의미는 다음과 같습니다.

order의 원소의미
"iceamericano","americanoice"차가운 아메리카노
"hotamericano", "americanohot"따뜻한 아메리카노
"icecafelatte", "cafelatteice"차가운 카페 라테
"hotcafelatte", "cafelattehot"따뜻한 카페 라테
"americano"아메리카노
"cafelatte"카페 라테
"anything"아무거나

제한사항

1 ≤ order의 길이 ≤ 1,000

입출력 예

orderresult
["cafelatte", "americanoice", "hotcafelatte", "anything"]19000
["americanoice", "americano", "iceamericano"]13500

입출력 예 설명

입출력 예 #1
예제 1번의 입력을 표로 나타내면 다음과 같습니다.

order[i] 팀원의 적은 음료 실제 주문 음료

"cafelatte"카페 라테차가운 카페 라테
"americanoice"차가운 아메리카노차가운 아메리카노
"hotcafelatte"따뜻한 카페 라테따뜻한 카페 라테
"anything"아무거나차가운 아메리카노

철수는 차가운 아메리카노 2잔, 차가운 카페 라테 1잔, 따뜻한 카페 라테 1잔을 주문하게 되므로 결제 금액은 4500 × 2 + 5000 × 2 = 19000원입니다. 따라서 19000을 return 합니다.

입출력 예 #2
예제 2번의 입력에서는 모든 음료를 차가운 아메리카노로 시키게 됩니다. 따라서 결제 금액은 4500 × 3 = 13500원이고 13500을 return 합니다.

내가 작성한 코드

function solution(order) {
    let result = 0;
    for(let i = 0; i < order.length; i++){
       if(order[i].includes('americano') || order[i].includes('anything')){
           result += 4500
       } else {
           result += 5000
       }
    }
    return result
}

ice, hot 상관 없이 가격이 동일하다고 했다.

즉, 굳이 핫, 아이스를 구별할 필요가 없다.

그렇다면 americano, cafelatte, anything에 따라 가격을 매겨주면 된다.

anything은 아이스아메리카노로 간주하기 때문에 4,500원이다.

order를 순환하고 includes메소드를 사용해
아메리카노와 아무거나가 있을 경우 4500원, 그렇지 않을 경우 5000원을 더해 반환했다.

조건문 개선 하기

function solution(order) {
    let result = 0;
    for(let i = 0; i < order.length; i++){
       if(order[i].includes('cafelatte')){
           result += 5000
       } else {
           result += 4500
       }
    }
    return result
}

다른 코드는 동일하지만 조건문을 조금 수정했다.
아메리카노, 아무거나를 먼저 가리기 보다는
카페라떼만 가리면 된다는 사실을 알게 되었다.

if(order[i].includes('cafelatte')){...}
이렇게 조건문을 수정함으로써 이전 코드 보다 간략하게 작성할 수 있었다.

다른 사람이 작성한 코드

const solution = (order) => order.reduce((acc, cur) => acc + (cur.includes('latte') ? 5000 : 4500), 0)

이분은 reduce를 활용했고 'cafelatte'에서 latte라는 문자열로 메뉴를 가려 내셨다.

function solution(order) {
    const menu = {
        americano: 4500,
        cafelatte: 5000,
        anything: 4500,
    }

    return order.map((v) => {
        for(key in menu) {
            if(v.indexOf(key) !== -1) {
                return menu[key];
            }
        }
    }).reduce((sum, cur) => sum + cur);
}

이분은 menu라는 객체를 만들어 문제를 푸셨다.

profile
💻 프론트엔드를 목표로 성장 중! (알아봤던 내용 등을 정리하기)

0개의 댓글