[사전캠프] 스파르타 자판기

2024. 8. 15. 18:58내일배움캠프

문제 : 자바 코드를 이용해 자판기를 만들어 보자.

조건 : 사용자가 메뉴를 볼 수 있어야 하며, 원하는 음료 및 지불 금액을 입력할 수 있고 반환 금액이 얼마인지 알 수 있어야 한다.

package vendingMachine;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * 사용자가 자판기의 음료 목록(사이다 : 1700원, 콜라 : 1900원, 식혜 : 2500원, 솔의눈 : 3000원)을 확인 할 수 있다.
 * 사용자는 음료를 선택하고 지불할 금액을 입력할 수 있다.
 * 만약 존재하지 않는 음료를 입력하면 실행이 종료된다.
 * 사용자는 음료를 구매한 후에 남은 금액(잔돈)을 확인할 수 있다.
 */
public class Main {
    public static void main(String[] args) {

        // 입력 값을 받기 위해 Scanner 객체 생성
        Scanner sc = new Scanner(System.in);

        // 음료명 및 음료가격 리스트
        List<String> drinks = new ArrayList<>(Arrays.asList("사이다", "콜라", "식혜", "솔의눈"));
        List<Integer> prices = new ArrayList<>(Arrays.asList(1700, 1900, 2500, 3000));

        // 자판기 메뉴 출력
        System.out.println("----------------------------------------");
        System.out.println("음료수 메뉴");
        for (int i = 0; i < drinks.size(); i++) {
            System.out.println("- " + drinks.get(i) + " " + prices.get(i) + "원");
        }
        System.out.println("----------------------------------------");
        System.out.println(" ");

        // 사용자에게 원하는 음료명 입력 요구
        System.out.print("원하는 음료명을 입력해 주세요 : ");
        String drink = sc.next();
        System.out.println(" ");

        int drinkIndex = findDrink(drinks, drink);  // 입력한 음료가 메뉴에 있는지 확인

        if (drinkIndex == -1) System.exit(0); // 존재하지 않는다면 실행 종료(정상 종료)

        // 사용자에게 지불할 금액 입력 요구
        // 금액이 모자르다면 재입력 요구
        int price = -1;
        while (prices.get(drinkIndex) > price) {

            System.out.print("지불할 금액을 입력해 주세요 : ");
            price = sc.nextInt();
            System.out.println(" ");

            if (prices.get(drinkIndex) > price) System.out.println("돈이 부족합니다.");
        }

        // 사용자에게 반환 금액(거스름돈)을 확인 시켜줌
        System.out.println("반환 금액 : " + (price - prices.get(drinkIndex)));
    }

    // 입력받은 음료명이 기존 음료명 리스트에 존재하는 확인하는 메서드
    // 존재하면 해당 값의 인덱스를 존재하지 않는다면 '-1' 반환
    public static int findDrink(List<String> drinks, String drink) {

        for (int i = 0; i < drinks.size(); i++) {
            if (drink.equals(drinks.get(i))) return i;
        }

        return -1;
    }
}

정상 실행 과정 결과
입력한 음료명이 메뉴에 없을 때 실행 종료

 

 코드 작성시 크게 두 가지 부분을 어떻게 구현할까 고민했다. 하나는 자판기에 없는 음료명 입력시 실행을 종료시키는 것, 그리고 나머지 하나는 음료가격 보다 적은 지불금액을 입력했을 때, 다시 지불금액을 입력하게 하는 것(재입력 순서는 딱히 문제 조건에 없었지만 아무래도 정상 흐름을 유지하려면 재입력 과정이 있어야 할 것 같아 염두했다).

 

 자판기에 없는 음료 파악은 'findDrink()' 메서드를 사용해 'drinks' 리스트에 'drink(입력 값)' 와 같은 요소가 있는지 확인, 같은 요소가 있다면 해당 요소의 인덱스를 반환, 없다면 '-1' 을 반환하도록 코드를 작성했다.이후에는 반환 인덱스(drinkIndex)가 '-1' 이라면 'System.exit(0)' 을 통해 실행을 종료하고 아니라면 지불금액을 입력받는 과정으로 넘어가게 된다.

 

 지불금액이 음료가격 보다 적을 때, 사용자에게 재입력을 요구하는 과정은 'while' 문을 활용했다. 입력한 지불금액이 음료가격보다 크거나 같을 때까지 'while' 문을 반복하도록 코드를 작성했다. 반복문 안에는 지불금액 입력을 요구하는 메시지 출력과 지불금액 입력, 지불금액이 모자랄 경우 메시지 출력이 있다.