[ 백준 ] 17479번 - 정식당

NaHyun_kkiimm·2022년 3월 20일
0

알고리즘

목록 보기
8/18
post-thumbnail

< 문제 정보 >

[ 문제 ]

미리 입력받은 메뉴판과 손님이 주문한 메뉴 간의 조건을 확인하고, 조건이 맞다면 주문을 허락하는 Okay를 조건이 하나라도 맞지 않다면, 주문을 거절하는 No를 출력하는 문제

[ 예시 ]

  • 입력 :
    3 2 3
    noodle 10000
    tteokbokki 5000
    sundae 7000
    cutlet 12000
    friedrice 8000
    dumpling
    potatochips
    fishcake
    6
    noodle
    noodle
    cutlet
    friedrice
    cutlet
    potatochips
  • 출력 :
    Okay

[ 규칙 ]

  • 메뉴판의 종류 : 일반 메뉴, 특별 메뉴, 서비스 메뉴
  • 조건
    (1) 일반 메뉴 : 몇 개를 시키든 상관 없음
    (2) 특별 메뉴 : 일반 메뉴의 음식 주문 금액이 20,000원 이상이어야 주문할 수 있음
    (3) 서비스 메뉴 : 오직 단 1개만 주문 가능. 일반 메뉴 + 특별 메뉴의 주문 가격이 50,000원 이상이어야 주문할 수 있음

[ 백준 ]


< 풀이 >

  • 문제를 구현할 때 중요한 것은 "주문할 수 있다"라는 것이다. 즉, 특별 메뉴를 주문하지 않을 수도, 서비스 메뉴를 주문하지 않을 수도 있다는 것이다.
    해시맵을 주로 이용하였고, 총 3개의 해시맵을 정의하였다. 음식명을 key 값으로 가격을 value로 하는 food 해시맵. 음식명을 key 값으로 메뉴판(일반, 특별, 서비스)를 value로 받는 kind 해시맵. 주문한 메뉴판 종류를 key 값으로 해당 등급의 주문 메뉴 갯수를 value로 하는 order 해시맵.
  • food와 kind는 처음 메뉴판에 음식을 정의할 때 초기화하고, order은 손님에게 주문을 받을 때 정의된다. 모든 정의가 완료되었다면 3개의 해시맵을 이용하여 조건에 맞는지 탐색하고 결과를 도출한다.
  • 조건을 확인할 때 주의할 것은 어떤 주문도 넣지 않는 경우가 있다는 것과 hashmap에서 null 값을 주의해야한다는 것이다. 몇 번의 시도에서 NullpointException이 나와 런타임에러 때문에 고생을 좀 했었다.

[ 코드 ]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args){

        HashMap<String, Integer> food = new HashMap<>();  // 음식명, 가격
        HashMap<String, String> kind = new HashMap<>();   // 음식명, 메뉴판
        HashMap<String ,Integer> order = new HashMap<>();   // 주문한 메뉴판 종류, 해당 등급의 주문 메뉴 갯수
        Scanner sc = new Scanner(System.in);
        int[] amount = new int[3];
        String name, order_name;
        String answer = "Okay";
        int price, order_amount, l=0;
        long general_total = 0;
        long special_total = 0;

        for(int i=0;i<3;i++){
            amount[i] = sc.nextInt();
            l += amount[i];
        }

        for (int i=0;i<l;i++) {
            if (amount[0]>0) {
                name = sc.next();
                price = sc.nextInt();
                food.put(name,price);
                kind.put(name, "normal");
                amount[0]--;
            }
            else if (amount[1]>0) {
                name = sc.next();
                price = sc.nextInt();
                food.put(name,price);
                kind.put(name, "special");
                amount[1]--;
            }
            else {
                name = sc.next();
                kind.put(name, "service");
                amount[2]--;
            }
        }

        order_amount = sc.nextInt();

        if (order_amount>0) {
            for (int i = 0; i < order_amount; i++) {
                order_name = sc.next();     // 주문한 음식 이름
                if (!kind.containsKey(order_name))   // 주문한 음식이 메뉴판에 없을 경우
                    answer = "No";
                else {          // 메뉴판에 있을 경우
                    String rank = kind.get(order_name); // 해당 메뉴의 등급
                    if (!order.containsKey(rank)) {      // 주문 내역에서 주문한 등급의 음식 수가 없는 경우
                        order.put(rank, 1);     // 주문 추가
                    } else      // 1개이상 있는 경우
                        order.put(rank, order.get(rank) + 1);   // 등급, 해당 등급 주문 수 증가
                    if (rank.equals("normal"))      // 등급이 일반일 경우
                        general_total += food.get(order_name);  // 일반 주문 총 가격
                    else if (rank.equals("special"))    // 등급이 특별일 경우
                        special_total += food.get(order_name);  // 특별 주문 총 가격
                }
            }
            if (order.containsKey("special")) { // 특별 주문을 한 경우
                if (general_total < 20000)  // 일반 가격합이 20000미만일 경우
                    answer = "No";
            }
            if (order.containsKey("service")) { // 서비스 주문을 할 경우
                if ((general_total + special_total < 50000))    // 총 5만원 미만일 경우
                    answer = "No";
                else if (order.get("service") > 1)  // 서비스 주문 수가 2이상일 경우
                    answer = "No";
            }
        }

        System.out.println(answer);

    }
}
재밌게 풀었던 문제였다. 문제 형식도 그렇게 어렵지 않았고, 암튼 재밌었다!
profile
이 또한 지나가리라

0개의 댓글