본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 풀이 3차 10번 (Iterator를 이용한 List순회)

by 우공80 2022. 10. 21.
728x90

레스토랑과 미용실의 예약관리하기

문제 지문 #10


미용실과 레스토랑이 예약을 받는 기준은 다음과 같습니다.

  • 미용실
    • 인원수가 1명인 경우에만 예약받습니다.
    • 다른 손님과 예약 시간이 겹칠 수 없습니다.
  • 레스토랑
    • 인원수가 2명 이상 8명 이하인 경우에만 예약받습니다.
    • 최대 두 팀까지 예약 시간이 겹칠 수 있습니다.

두 가게에서 예약을 받은 횟수를 계산하기 위해 다음과 같이 Customer, Shop, HairShop, Restaurant 클래스를 작성했습니다.

shop2_java.png

  • Customer:
    • Customer : 고객을 나타내는 클래스입니다.
    • id : 고객 식별 번호를 나타냅니다.
    • time : 고객이 신청한 예약 시간을 나타냅니다.
    • numOfPeople : 예약 인원수를 나타냅니다.
  • Shop :
    • Shop : 가게를 나타내는 클래스입니다.
    • reserveList : 가게에 예약한 고객 리스트입니다.
    • reserve : 고객을 매개변수로 받아, 예약 고객 리스트에 추가 후 true를 return 합니다.
  • HairShop :
    • HairShop : 미용실을 나타내는 클래스이며, Shop을 상속합니다.
    • reserve : 고객을 매개변수로 받아, 미용실의 예약 기준에 맞는지 검사합니다. 예약을 받았다면 예약 고객 리스트에 추가 후 true를 return 하고, 그렇지 않으면 false를 return 합니다.
  • Restaurant :
    • Restaurant는 레스토랑을 나타내는 클래스이며, Shop을 상속합니다.
    • reserve : 고객을 매개변수로 받아, 레스토랑의 예약 기준에 맞는지 검사합니다. 예약을 받았다면 예약 고객 리스트에 추가 후 true를 return 하고, 그렇지 않으면 false를 return 합니다.

예약을 원하는 고객 정보가 담긴 배열 customers와 shops가 매개변수로 주어질 때, 두 가게에서 예약받은 횟수를 return 하도록 solution 메서드를 작성하려고 합니다. 위 클래스 구조를 참고하여 주어진 코드의 빈칸을 적절히 채워 전체 코드를 완성해주세요.


매개변수 설명

예약을 원하는 고객 정보가 담긴 배열 customers와 shops가 solution 메서드의 매개변수로 주어집니다.

  • customers의 길이와 shops의 길이는 항상 같습니다.
  • customers의 각 원소에는 고객 정보가 [고객 ID, 예약 시간, 예약 인원수] 순으로 들어있습니다.
    • 고객 ID는 1 이상 10,000 이하인 자연수입니다.
    • 예약 시간은 0 이상 23 이하인 정수입니다.
    • 예약 인원수는 1 이상 10 이하인 자연수입니다.
    • 고객 ID는 중복해서 주어지지 않습니다.
  • customers에는 고객이 예약을 신청한 순서대로 들어있습니다.
  • shops는 각 고객이 예약할 가게를 나타내며, "hairshop" 또는 "restaurant" 로만 구성되어 있습니다.
  • i 번째 고객이 예약할 가게는 shops [i]입니다.
  • 예약을 신청한 고객의 수는 1 이상 10 이하입니다.

return 값 설명

두 가게에서 예약받은 횟수를 return 해주세요.


예시

customers shops return
[[1000, 2, 1], [2000, 2, 4], [1234, 5, 1], [4321, 2, 1], [1111, 3, 10]] ["hairshop", "restaurant", "hairshop", "hairshop", "restaurant"] 3

 

예시 설명

고객별 예약 정보는 다음과 같습니다.

ID 예약 시간 인원수 가게
1000 2 1 hairshop
2000 2 4 restaurant
1234 5 1 hairshop
4321 2 1 hairshop
1111 3 10 restaurant
  • 첫 번째 고객은 미용실에서 예약받습니다.
  • 두 번째 고객은 레스토랑에서 예약받습니다.
  • 세 번째 고객은 미용실에서 예약받습니다.
  • 네 번째 고객은 예약받지 않습니다. 2시에 미용실을 먼저 예약한 손님이 있기 때문입니다.
  • 다섯 번째 고객은 예약받지 않습니다. 레스토랑에 한 번에 예약 가능한 인원수는 2명 이상 8명 이하입니다.
728x90

 

혼자 풀이

빈칸 채우기 문제입니다.
여기서는 Iterator를 이용해서 ArrayList인 reserveList를 순회하면서 동일 시간대 예약 손님이 있는지를 찾습니다.
Iterator를 강의 중 들은 기억은 있는데, 어떻게 쓰는지 기억이 잘 안 났습니다.
next 나오는 거 보니 리스트 순회하는 개념이구나 정도로 이해하고, 문제에 주어진 대로 값을 비교하는 부분만 작성했습니다.
코드에 대한 설명은 아래에 주석으로 달았습니다.

import java.util.ArrayList;
import java.util.Iterator;

//Shop 인터페이스와 HairShop, Restaurant 클래스는 Inner Class로 작성되어있습니다. 아래 코드를 잘 읽고 빈칸을 채워주세요.
class MySolution {
    class Shop{
        protected ArrayList<Customer> reserveList;
        public Shop() {
			this.reserveList = new ArrayList<Customer>();
		}
        public boolean reserve(Customer customer){
            reserveList.add(customer);
            return true;
        }
    }
    class Customer{
        public int id;
        public int time;
        public int numOfPeople;
        public Customer(int id, int time, int numOfPeople){
            this.id = id;
            this.time = time;
            this.numOfPeople = numOfPeople;
        }
    }
//    class HairShop @@@ {
    //Shop 인터페이스라고 되어있는데, implements를 하면 안되고 extends를 해야함
    class HairShop extends Shop {
        public HairShop(){
            super();
        }
        
//        @@@{
        public boolean reserve(Customer customer){
//            if(@@@ != 1)
            if(customer.numOfPeople != 1) //인원수가 1이 아니면 예약받지 않음
                return false;
            
            Iterator<Customer> iter = reserveList.iterator();
            while (iter.hasNext()) {   //iterator를 사용하여 reserveList를 순회
                Customer r = iter.next();
//                if(@@@)
                if(r.time==customer.time)  //예약시간이 겹치면 예약받지 않음
                    return false;
            }
            reserveList.add(customer); //예약 불가능 조건에 해당하지 않으면 예약리스트에 추가
            return true;
        }
    }
//    class Restaurant @@@ {
    class Restaurant extends Shop {
        public Restaurant(){
            super();
        }
        
//        @@@{
//            if(@@@)
        public boolean reserve(Customer customer){
            if(customer.numOfPeople < 2 | customer.numOfPeople > 8) //2명이상 8명이하만 예약가능
                return false;
            int count = 0;
                        
            Iterator<Customer> iter = reserveList.iterator();
            while (iter.hasNext()) {  //iterator를 사용하여 reserveList를 순회
                Customer r = iter.next();
//                if(@@@)
                if(r.time==customer.time) //예약시간이 같으면 count를 증가시키고
                    count += 1;
            }
            if(count >= 2)  //count가 2이상이면 예약이 불가능
                return false;
            reserveList.add(customer); //예약 불가능 조건에 해당하지 않으면 예약리스트에 추가
            return true;
        }
    }

    public int solution(int[][] customers, String[] shops) {
        Shop hairshop = new HairShop();
        Shop restaurant = new Restaurant();
        int count = 0;
        for(int i = 0; i < shops.length; i++){
            if(shops[i].equals("hairshop")){
                if(hairshop.reserve(new Customer(customers[i][0], customers[i][1], customers[i][2])))
                    count += 1;
            }
            else if(shops[i].equals("restaurant")){
                if(restaurant.reserve(new Customer(customers[i][0], customers[i][1], customers[i][2])))
                    count += 1;
            }
        }
        return count;
    }

    // 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
    public static void main(String[] args) {
        MySolution sol = new MySolution();
        int[][] customers = {{1000, 2, 1},{2000, 2, 4},{1234, 5, 1},{4321, 2, 1}, {1111, 3, 10}};
        String[] shops = {"hairshop", "restaurant", "hairshop", "hairshop", "restaurant"};
        int ret = sol.solution(customers, shops);

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 " + ret + " 입니다.");
    }
}

 

정답


혼자 풀이와 동일합니다.

첨부 파일

프로젝트 파일 전체를 첨부합니다.
Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.

ThirdQuestion10.zip
0.02MB

출처: https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp

728x90

댓글