문제풀이/일일연습문제

일일문제 : 9번째- 221227 [12-4-화] - 엘리베이터

Mo_bi!e 2022. 12. 27. 12:18

[9번]

1. 문제설명

// 엘리베이터는 4명이 탑승이 가능하며, 총 3개 층으로 이루어져있음.

// 탑승객은 목표 층을 입력하여 해당 층이 되면, 자동으로 내리게 구현.

// 엘리베이터는 무조건 올라갔다가 내려가는 형태로 이동.



1. package 는 com.elevator.service 이다.

(실제 현업에서도 식별하기 위해 domain name으로 사용합니다.)



2. main 함수는 ElevatorController 클래스에 만든다.



3. 서비스 구현은 ElevatorService 클래스에 만든다.




4. 참고하시라고 텍스트 드립니다. 또는 자유롭게 하셔도 너무 좋습니다. 🙂

 

public static void main(String[] args) {
// 엘리베이터는 4명이 탑승이 가능하며, 총 3개 층으로 이루어져있음.
// 탑승객은 목표 층을 입력하여 해당 층이 되면, 자동으로 내리게 구현.
// 엘리베이터는 무조건 올라갔다가 내려가는 형태로 이동.

ElevatorService es = new ElevatorService();

System.out.println("---- Welcome Elevator ----");

es.run();
}



switch(sc.nextLine()) {
case "1" :
break;
case "2" :
break;
case "3" :
break;
case "4" :

break;
default
 
 



System.out.println("메뉴를 선택하세요.");
System.out.println("1.탑승  2.이동  3.탑승현황  4.종료");
System.out.println("탑승할 공간이 없습니다.");
System.out.println("층 수를 선택해 주세요.");
System.out.println("1.1층\t2.2층\t3.3층");
System.out.println("다시 입력해주세요.");
System.out.println("목적지로 현재 층은 안됩니다.");
System.out.println("입력하신 층은 " +  + "층입니다.");
System.out.println("현재 층수는" +  + "층 입니다.");
System.out.println( + "명이 하차하였습니다.");
System.out.println("---- 탑승 현황 ----");
System.out.println("현재 탑승 인원은 " +  + "명 입니다.");
System.out.println("현재 층수는 " +  + "층 입니다.");
System.out.println("종료합니다.");
System.out.println("잘못입력하였습니다.");

 

System.out.println("엘리베이터 상태[현재층 : " + + "]");
System.out.print("[" + + "]");
System.out.print("[ ]");
System.out.println("행동을 입력하세요.");
System.out.println("1.이동 2.탑승 9.종료");
System.out.println("어디에 탑승하시겠습니까?[취소 : 9]");
System.out.print("[불가능]");
System.out.print("[" +  + "]");
System.out.println("몇층으로 가시겠습니까?[현재층 : " + + "]");
System.out.println("갈 수 없는 층입니다.");
System.out.println("잘못입력하셨습니다.");
System.out.println("엘리베이터 운행을 종료합니다.");










5. 결과 예시입니다. 자유롭게 하셔도 너무 좋습니다. 🙂

 

  1. 탑승 선택시
---- Welcome Elevator ----
메뉴를 선택하세요.
1.탑승  2.이동  3.탑승현황  4.종료

1

층 수를 선택해 주세요.
1.1 2.2 3.3

2

입력하신 층은 2층입니다.

 

메뉴를 선택하세요.
1.탑승  2.이동  3.탑승현황  4.종료

3

---- 탑승 현황 ----
현재 탑승 인원은 2 입니다.
현재 층수는 1 입니다.
메뉴를 선택하세요.
1.탑승  2.이동  3.탑승현황  4.종료




  1. 이동 시
현재 층수는3층 입니다.
메뉴를 선택하세요.
1.탑승  2.이동  3.탑승현황  4.종료

2

현재 층수는2층 입니다.
2명이 하차하였습니다.
메뉴를 선택하세요.
1.탑승  2.이동  3.탑승현황  4.종료

2



  1. 탑승현황황
현재 층수는3층 입니다.
메뉴를 선택하세요.
1.탑승  2.이동  3.탑승현황  4.종료

3

---- 탑승 현황 ----
현재 탑승 인원은 0 입니다.
현재 층수는 2 입니다.
메뉴를 선택하세요.
1.탑승  2.이동  3.탑승현황  4.종료



  1. 종료 시

 

4

종료합니다.






6. 다른 결과 예시입니다. 자유롭게 하셔도 너무 좋습니다. 🙂

엘리베이터 상태[현재층 : 1]
[ ][ ][ ][ ]
행동을 입력하세요.
1.이동 2.탑승 9.종료

1

엘리베이터 상태[현재층 : 2]
[ ][ ][ ][ ]
행동을 입력하세요.
1.이동 2.탑승 9.종료

2

어디에 탑승하시겠습니까?[취소 : 9]
[0][1][2][3]

3

몇층으로 가시겠습니까?[현재층 : 2]

2

갈 수 없는 층입니다.
몇층으로 가시겠습니까?[현재층 : 2]

3

엘리베이터 상태[현재층 : 2]
[ ][ ][ ][3]
행동을 입력하세요.
1.이동 2.탑승 9.종료

1

엘리베이터 상태[현재층 : 3]
[ ][ ][ ][ ]
행동을 입력하세요.
1.이동 2.탑승 9.종료

9

엘리베이터 운행을 종료합니다.

2. 나의 해답

<ElevatorController>

package com.elevator.service;

public class ElevatorController {

		// 엘리베이터는 4명이 탑승이 가능하며, 총 3개 층으로 이루어져있음.
		// 탑승객은 목표 층을 입력하여 해당 층이 되면, 자동으로 내리게 구현.
		// 엘리베이터는 무조건 올라갔다가 내려가는 형태로 이동.
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		ElevatorService es = new ElevatorService();
		
		System.out.println("---- Welcome Elevator ----");
		
		es.run();


	}
	
//	System.out.println("메뉴를 선택하세요.");
//	System.out.println("1.탑승  2.이동  3.탑승현황  4.종료");
//	System.out.println("탑승할 공간이 없습니다.");
//	System.out.println("층 수를 선택해 주세요.");
//	System.out.println("1.1층\t2.2층\t3.3층");
//	System.out.println("다시 입력해주세요.");
//	System.out.println("목적지로 현재 층은 안됩니다.");
//	System.out.println("입력하신 층은 " +  + "층입니다.");
//	System.out.println("현재 층수는" +  + "층 입니다.");
//	System.out.println( + "명이 하차하였습니다.");
//	System.out.println("---- 탑승 현황 ----");
//	System.out.println("현재 탑승 인원은 " +  + "명 입니다.");
//	System.out.println("현재 층수는 " +  + "층 입니다.");
//	System.out.println("종료합니다.");
//	System.out.println("잘못입력하였습니다.");
//
//
//	System.out.println("엘리베이터 상태[현재층 : " + + "]");
//	System.out.print("[" + + "]");
//	System.out.print("[ ]");
//	System.out.println("행동을 입력하세요.");
//	System.out.println("1.이동 2.탑승 9.종료");
//	System.out.println("어디에 탑승하시겠습니까?[취소 : 9]");
//	System.out.print("[불가능]");
//	System.out.print("[" +  + "]");
//	System.out.println("몇층으로 가시겠습니까?[현재층 : " + + "]");
//	System.out.println("갈 수 없는 층입니다.");
//	System.out.println("잘못입력하셨습니다.");
//	System.out.println("엘리베이터 운행을 종료합니다.");
//


}

 

<ElevatorService>

package com.elevator.service;

import java.util.Scanner;

// 실수 지점
/*

0. 이전 지하철문제의 easy version이여서 수월했다. 
1. floor를 현재층 받는거 아니면 굳이 필요없음, 층은 승객의 값으로 넣어주면됨 
2. break 다음 reuturn 은 도달할수없음 
3. if는 / while은 조건작성할 때 해매지 말고 잘하자! 


 */


public class ElevatorService {
	
	int[] passangers; //4명 가능  => 값이 
//	int[] floor; // 3개의 층  (0층 미탑승)
	
	int floor;
	boolean direction;
	
	
	public ElevatorService() {
		// TODO Auto-generated constructor stub
		
		passangers = new int[4];
//		floor = new int[3];
		
		for(int i = 0 ; i < passangers.length ; i++)
			passangers[i] = 0;
		
//		for(int i = 0 ; i < floor.length ; i++)
//			floor[i] = i + 1;
		
		floor = 1;
		
		direction = true;
	}
	

	public void run() {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
	SHUTDOWN :	
		while(true) {
		System.out.println("메뉴를 선택하세요.");
		System.out.println("1.탑승  2.이동  3.탑승현황  4.종료");
		
		
		switch(sc.nextLine()) {
		case "1" : ride();
			break;
		case "2" : move();
			break;
		case "3" : status();
			break;
		case "4" : System.out.println("종료합니다.");
			break SHUTDOWN;
		default : System.out.println("잘못입력하셨습니다. 다시 입력해주세요 ");
			
		}
		
		System.out.println("현재 층수는 " + floor + "층 입니다 ");
		
		
	}
		sc.close();
}


	private void ride() {
		// TODO Auto-generated method stub
		
		Scanner scan = new Scanner(System.in);
		int passanger = 0;
		int input = 0;
		
		//미탑승 승객 가려내기 용 
		for(int i = 0 ; i < passangers.length ; i++) {
		
			if(passangers[3] != 0 ) {
				System.out.println("탑승할 공간이 없습니다.");
				return ;
				
			}
			else if(passangers[i] == 0){
				System.out.println("층 수를 선택해 주세요.");
				System.out.println("1.1층\t2.2층\t3.3층");
				passanger = i;
				break;
			}
			
		}
		//탑승했다면 	
		do{
		input = scan.nextInt();
		passangers[passanger] = input;
		System.out.printf("입력하신층은 %d층입니다. \n",input);
		
			if((input < 0 || input > 4 )) {
				System.out.println("목적지로 입력한 층은 안됩니다. ");
				System.out.println("다시 입력해주세요.");
			}
			else if(input == floor) {
				System.out.println("현재 층입니다. ");
				System.out.println("다시 입력해주세요.");
				
			}
				
		
		}while(((input < 0 || input > 4 ) || input == floor));
		
		scan.close();
	}


	private void move() {
		// TODO Auto-generated method stub
		System.out.println();
		int count = 0; //하차 카운트 
		
		//위아래로 엘베 움직이기 
		if(direction == true)
			floor++ ;
		else
			floor-- ;
		
		
		//엘베 방향성 결정 
		if(floor == 3)
			direction = false;
		else if(floor == 1)
			direction = true;
		
		//하차승객 수 계산 
		for(int i = 0 ; i < passangers.length ; i++) {
			
			if(passangers[i] == floor) {
				passangers[i] = 0;
				count ++;
			}
		}
		System.out.println(count + "명이 하차하였습니다. ");
	}


	private void status() {
		// TODO Auto-generated method stub
		System.out.println("---- 탑승 현황 ----");
		int count = 0; //탑승 카운트 
		
		//0층이 없으면 카운트업
		for(int i = 0 ; i < passangers.length ; i++) 
			if(passangers[i] != 0)
				count ++;
		
		System.out.println("현재 탑승 인원은 " + count  + "명 입니다.");
	}
}

 

 

 

3. 정답 코드

상동

 

4. 보충 및 회고 

(1) 보충

객체지향으로 시도해보는것도 바람직할것 같다.

 

 

(2) 회고 : 문제풀이과정에서 어떻게 접근하려고했는지 (접근방법) + 어려움이 있었는데 해결했다.

 

0. 이전 지하철문제의 easy version이여서 수월했다.

 

1. floor를 현재층 받는거 아니면 굳이 필요없음, 층은 승객의 값으로 넣어주면됨

floot를 할때 좀 더 자료에 대해서 고민해보자!

 

2. break 다음 reuturn 은 도달할수없음

나의 경우에 이렇게 해서 경고문에 unreachable이 떳다.

이거에 대해서 무슨의미인지 고민을 제대로 안해보았다

이런점에 비추어 보면은 경고문등을 꼼꼼히 읽어보자!

 

3. if는 시작 / while은 조건작성할 때 해매지 말고 잘하자!

이번에도 조건문 설정에서 하나씩 돌려보고 판단하는 하드코딩을 했다

do -while문을 쓸 때 if절과 while절의 조건은 동일하다!