https://www.acmicpc.net/problem/174790
[문제 해결]
- 메뉴를 입력 받을 때 Menu이름과 가격을 menu 해쉬맵에 담아주고, 동시에 Menu 이름과 종류를 kindOfMenu 해쉬맵에 담아준다.
- kindOfMenu 해쉬 맵에서 사용자가 주문한 메뉴가 어떤 종류인지 확인한다.
- 일반 메뉴이면 일반 메뉴 가격을 업데이트 해주고 특별 메뉴이면 특별 메뉴 가격을 업데이트 해준다.
- 이때 특별 메뉴이면 사용자가 주문한 특별 메뉴 개수를 카운팅 해준다.
- 서비스 메뉴이면 사용자가 주문한 서비스 메뉴 개수만 카운팅 해준다.
- 문제에서 제시된 조건을 if문으로 확인한 후 답을 출력한다.
[주의 할 점]
- 가격을 담는 변수를 int형으로 하면 틀리게된다.
- 그 이유는 문제에 제시된 입력 조건을 보면 50000 이하의 정수 3개가 주어진다.
- 이 뜻은 일반 메뉴 + 스페셜 메뉴 = 최대 10만이다. (두 메뉴의 개수 합)
- 그러면 모든 메뉴 가격이 100만원이라 가정하고 서비스를 안시켰을때 최대 주문할 수 있는 음식의 개수는 15만이므로
- 일반 메뉴가격 + 스페셜 메뉴 가격은 최대 150억원 까지 나올 수 있다.
- 그렇게 되면 int형 범위를 넘어 서므로 long이나 Integer를 이용해야한다.
- 참고로 제한 시간도 고려 해주어야 하는 문제이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
HashMap<String, Integer> menu = new HashMap<>();
HashMap<String, String> kindOfMenu = new HashMap<>();
int generalMenuNum = Integer.parseInt(st.nextToken());
int specialMenuNum = Integer.parseInt(st.nextToken());
int serviceMenuNum = Integer.parseInt(st.nextToken());
for(int i=0; i<generalMenuNum; i++){
st = new StringTokenizer(br.readLine());
String name = st.nextToken();
menu.put(name, Integer.parseInt(st.nextToken()));
kindOfMenu.put(name, "general");
}
for(int i=0; i<specialMenuNum; i++){
st = new StringTokenizer(br.readLine());
String name = st.nextToken();
menu.put(name, Integer.parseInt(st.nextToken()));
kindOfMenu.put(name, "special");
}
for(int i=0; i<serviceMenuNum; i++) {
String name = br.readLine();
menu.put(name, 0);
kindOfMenu.put(name, "service");
}
long generalPrice = 0;
long specialPrice = 0;
int specialSize = 0;
int orderServiceMenuNum = 0;
int orderMenuNum = Integer.parseInt(br.readLine());
for(int i=0; i<orderMenuNum; i++){
String orderMenu = br.readLine();
String menuKind = kindOfMenu.get(orderMenu);
if(menuKind.equals("general"))
generalPrice += menu.get(orderMenu);
else if(menuKind.equals("special")){
specialPrice += menu.get(orderMenu);
specialSize++;
}
else orderServiceMenuNum ++;
}
if((generalPrice < 20000 && specialSize > 0) || (generalPrice + specialPrice < 50000 && orderServiceMenuNum > 0) || orderServiceMenuNum > 1)
System.out.println("No");
else
System.out.println("Okay");
}
}