본문 바로가기
lecture.js/algorithm.log

#008 고속버스 배치

by malda 2017. 7. 12.
#문제)
한버스의 좌석이 A열, B열, C열이 있다.
2명의 승객이 왔을때 A열, B열에 나란히 배치되고, 한명인 경우 C열에 배치한다.
C열이 모두 찬 경우, A열,B열 중 비어있는 곳으로 배치되고, 한칸 뒤로 2명이 나란히 배치되도록 한다.


나는 일단 두개의 배열로 나눴다.
단체 좌석 배열, 개인 전용 좌석 배열

각각의 자리가 비어있으면 문제가 안되는데 둘중에 하나가 차있는 경우 조건처리가 필요하다.
두가지 경우의 수
첫번째, 한명이 예약하려하는데 개인전용 좌석이 다 찬 경우
- 단체 좌석에 배정하되 다음 사람을 위해 한칸을 비워놓는다.

두번째, 두명이상이 예약하려는 단체 좌석이 모두 찬 경우,
- 개인 전용 좌석에 일렬로 배정한다.


package dataStructure.prediction.problem;

import java.util.Scanner;

public class PriorityBus {
    private int maxAreaCount = 5;
    private int[][] coupleArea = new int[maxAreaCount][2];
    private int[] singleArea = new int[maxAreaCount];
    private int singleIndex = 0;
    private int coupleRowIndex = 0;
    private int coupleColIndex = 0;
    private Scanner scanner = null;
   
    public PriorityBus() {
        // TODO Auto-generated constructor stub
        this.scanner = new Scanner(System.in);
    }
  
    public void reservation(int n) {
        if(n == 0) {
            System.out.println("are you kidding?");
            return;
        }else if(n < 2) {
            reservationSinle();
        }else {
            reservationMulti(n);
        }
    }
   
    private int getCommand() {
        return scanner.nextInt();
    }
   
    private void reservationSinle() {
        if(isEmptySingleArea()) {
            singleArea[singleIndex++] = 1;
        }else if(isEmptyCoupleArea()){
            coupleArea[coupleRowIndex][coupleColIndex] = 1;
            coupleRowIndex++;
        }else {
            System.out.println("can't reservation. full.");
        }
    }
   
    private boolean isEmptySingleArea() {
        return singleIndex < maxAreaCount ? true : false;
    }
   
    private boolean isEmptyCoupleArea() {
        return coupleRowIndex < maxAreaCount ? true : false;
    }
   
    private void reservationMulti(int n) {
        for(int i=1;i<=n;i++) {
            if(isEmptyCoupleArea()) {
                coupleArea[coupleRowIndex][coupleColIndex++] = 1;
                if((i%2 == 0)) {
                    coupleRowIndex++;
                    coupleColIndex=0;
                }
            }else if(isEmptySingleArea()) {
                singleArea[singleIndex] = 1;
                singleIndex++;
            }else {
                System.out.println("can't reservation");
            }
        }
        //홀수인경우 row 증가
        if(n % 2 != 0) {
            coupleRowIndex++;
        }
    }
   
    public void print() {
        for(int i=0; i<maxAreaCount; i++) {
            System.out.printf("%2d %2d \t %2d", coupleArea[i][0], coupleArea[i][1], singleArea[i] );
            System.out.println();
        }
    }
   
    public void close() {
        scanner.close();
    }
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PriorityBus bus = new PriorityBus();
        while(true) {
            System.out.println("input reservation number : (if want to exit input '-1')");
            int command = bus.getCommand();
            if(command == -1) {
                break;
            }
            bus.reservation(command);
            bus.print();
        }
        bus.close();
    }

}


*아직 개선해야할 부분이 있다. 
개인 좌석이 모두 차서 커플좌석에 앉는 경우, 사실 버스 회사 효율성을 보더라도 한칸을 띄어놓는건 비효율이다.
그렇다고 다닥다닥 붙이면 고객이 싫어함.
따라서, 일단 한칸 비워두되 개별 손님이 연달아 오는 경우, 같이 앉게 해야하도록 개선하는 코드를 짜야한다.

'lecture.js > algorithm.log' 카테고리의 다른 글

#010 소인수분해  (1) 2017.07.12
#009 소수 판별  (0) 2017.07.12
#007 배열 회전  (0) 2017.07.10
#006 열우선 배열  (0) 2017.07.10
#005 모래시계 배열  (0) 2017.07.10