Test-Daily Test(22-12-마지막주)

 

1. [22.12.26] : 지하철 시스템 코드 최종 수정

package com.test.service;

import java.util.Scanner;

// **** 문제점1 : 새로운 목적지를 선택하면 그 목적지가 현재역으로 위치가 바뀜. ****** : [해결] - 약간의 로직 필요하며 현재역 출력 부분과 목적지 List 출력 부분을 따로 객체 변수로 getter, setter로 구현함 
// **** 문제점2 : 이동하고 나서 목적지 List이 고정된 형태이다.			****** : [해결] -
// **** 문제점3 : 탑승 시, 스택처럼 쌓이지 않고 자리를 지정해서 앉는 느낌이다. - 해결하지 못하면, 승객 중에서 같은 목적지에서 내리는 승객을 처리할 수 없다!!(중복 처리)
// **** 문제점4 : 탑승 시, 현재역에서 현재역에 다시 탑승하면 다시 입력해달라고 할 것. 탑승하자마자 내려야하므로 (나중에 고치기) ****** : [해결하기] - do while 이용할 것
// **** 문제점 5 : 오입력 시, 다시 입력해야함.						 ****** : [해결하기] - do while 이용할 것

public class SubwayService {
	
	boolean ox = true;
	
	String[] subwaySections = {"1호차","2호차","3호차","4호차"};
	String[] destinations = {"합정역","홍대입구역","신촌역","이대역","아현역"};
	
	Section[] sections = new Section[4];				// 객체 지향으로 배열을 연결하기 위한 객체 배열 생성
	Station[] stations = new Station[5];
	Passenger[][] passengers = new Passenger[4][5];
	
	int[] passengerCount = new int[4];					// 각 지하철역마다 사람수 count 변수 선언
	int[] statonCount = new int[5];						
	
	int[] currentStationList = new int[5];				// 현재역 표시 인덱스		
	int[] nextStationList = new int[5];					// 목적지 업데이트 후 현재역 표시 인덱스
	
	
	int stationNum = 0;				// 상세 부분의 2차원 배열 인덱스
	int sectionNum = 1;				// 상세 부분의 2차원 배열 인덱스
	
	int	currentStream = -1;			// 초기 목적지 List 인덱스	
	int nextStream = -1;			// 목적지 선택 후 목적지 List 인덱스				
	
	
	public void run() {
		
		for (int i = 0; i < 4; i++) 					// 객체 배열 할당을 가장 처음에 해줘야지  while문 돌때마다 switch문 실행 시, 초기화가 되지 않는다. 
			sections[i] = new Section();				// 중요!! sections[i] 객체 배열 생성 이렇게 앞에 생성해서 뒤에서 여러번 사용한다. 배열 할당이면서 초기화 느낌
		
		for (int i = 0; i < 5; i++)  					// 객체 배열 할당을 가장 처음에 해줘야지  while문 돌때마다 switch문 실행 시, 초기화가 되지 않는다. 
			stations[i] = new Station();				// 중요!! stations[i] 객체 배열 생성 이렇게 앞에 생성해서 뒤에서 여러번 사용한다. 배열 할당이면서 초기화 느낌
		
		for (int j = 0; j < 4; j++)  
			for (int i = 0; i < 5; i++)  
				passengers[j][i] = new Passenger();
		
		
		Flag :
		while(ox) {
			
			System.out.println("=================================");
			
			if(stations[0].getMoveCheck() == false)
				System.out.println("현재역은 " + stations[0].getCurrentStation() + "입니다."); // 1-1) 초기값 설정으로 해결
			else
				System.out.println("현재역은 " + stations[0].getNextStation() + "입니다."); // 1-2) 추가 설정으로 해결
			
			System.out.println("=================================");
			
			System.out.println("메뉴를 선택해주세요.");
			System.out.println("1. 탑승 // 2. 상세 보기 // 3. 이동 // 9. 종료");
			Scanner scan = new Scanner(System.in);
			
			switch (scan.nextLine()) {
	
			case "1":
				join();
				break;
	
			case "2":
				status();
				break;
	
			case "3":
				move();
				break;
	
			case "9":
				System.out.println("열차운행을 종료합니다.");
				break Flag;
	
			default:
				System.out.println("잘못 입력하셨습니다.");
	
			}
		
		}	
	}

	private void join() {
		
		Scanner scan = new Scanner(System.in);

		System.out.println("------- 탑승가능 현황 -------");


		
		for (int i = 0; i < 4; i++) { 
			
			if (sections[i].getSectionCount() < 4) {
				System.out.println((i+1) + "호차 : 가능");
			}
			else if (sections[i].getSectionCount() == 4) {
				System.out.println((i+1) + "호차 : 불가능");
			}
			
			if (sections[0].getSectionCount() == 4 && sections[1].getSectionCount() == 4 
					&& sections[2].getSectionCount() == 4 && sections[3].getSectionCount() == 4) {
				System.out.println("더이상 탑승 가능열차가 없습니다.");
			}
		}
		
		
		// ---------------- 열차 [section] ---------------------------------------------------------
		
		System.out.println("어느 열차에 탑승하시겠습니까?");
		
		for(int i =0; i<4; i++) {						// 처음 열차 차량 설정
			
			sections[i].setSectionNum(i+1);
			sections[i].setSectionName(subwaySections[i]);	
		}
		
														// 추가하기!! :  다음역을 반영하여 목적지 순서 나열 업데이트 출력 부분
		for(int i =0; i<4; i++) {						// 열차 차량 목록 출력
			sections[i].print();
		}
		System.out.println();
		
		
		
		sectionNum = Integer.parseInt(scan.nextLine());					// 타고 싶은 열차 차량  입력

		for(int i = 0 ; i <5; i++) {
			
			stations[i].setJoinCheck(true);			// "탑승" 먼저 누르고 "이동" 누른 것을 체킹하기 위해서 *********
													// (중요!! 배열 개수도 생각!! move메서드의 join 체킹을 위한 배열 개수 생각!)
			
			if (i == sectionNum-1) {							
				sections[i].setSectionCount(++passengerCount[i]);			// 타고 싶은 열차 차량의 사람수 count
				sections[i].setSectionName(subwaySections[sectionNum-1]);		// 타고 싶은 열차 차량 setting		
				
				System.out.println(sections[i].getSectionName());
				
			}
					
		}
		
		
		
		
		// ---------------- 목적지 [station] ---------------------------------------------------------
		// ** 에러 해결!! : 현재역 표시하는 메서드와 목적지를 표시하는 메서드를 따로 각각 구별해서 만들어줘야지 충돌하지 않는다!!!!
		
		System.out.println("목적지를 선택해주세요.");
		
		// 2-1) 첫 목적지 List 부분***** (목적지 List는 현재역을 빼고 나머지를 표시하므로 인덱스를 0~3까지만 출력 _ 원래는 5개여야하는데)
		
		currentStream = 0;
		
		for(int i =0; i<4; i++) {										// 목적지 List 나열
			
			
			if (destinations[i] == stations[0].getCurrentStation()) 	// 다음역 == 객체 배열 index
				currentStream = i;	
			
			stations[i].setStationNum(currentStream+2);
			stations[i].setStationName(destinations[++currentStream]);
			
			if(currentStream == 4) 
				currentStream = -1;	
		}
		
		// 2-2) 목적지 이동 후 목적지 List 부분***** (목적지 List는 현재역을 빼고 나머지를 표시하므로 인덱스를 0~3까지만 출력 _ 원래는 5개여야하는데)
		
		
		for(int i =0; i<4; i++) {									// 목적지 List 나열
			if(stations[i].getMoveCheck() == true) {
				
				if (destinations[i] == stations[0].getNextStation())  	// 다음역 == 객체 배열 index
					nextStream = i;	
				
				stations[i].setNextStationNum(nextStream+2);
				stations[i].setNextStationName(destinations[++nextStream]);
				
				if(nextStream == 4) 
					nextStream = -1;
				
			}
		}
		
		
		// ** 목적지 List는 현재역을 빼고 나머지를 표시하므로 인덱스를 0~3까지만 출력 _ 원래는 5개여야하는데)
		for(int i =0; i<4; i++) {
			 										// move()가 동작 안 했으면 그대로 currentPrint가 동작하게 

			if(stations[i].getMoveCheck() == false) {
				stations[i].currentListPrint();
			}
			else if(stations[i].getMoveCheck() == true) {
				stations[i].nextListPrint();
			}
			
			
				
		}
		System.out.println();
		
		
		// ------ [상세내용 부분에서 쓸 내용] ------
		
		stationNum = Integer.parseInt(scan.nextLine());			// 목적지 입력
		
		for(int i =0; i<5; i++) {								// 목적지 데이터 저장 -> 나중에 "상세내용" 부분에서 사용
			if (i == stationNum-1) {
				stations[i].setStationNum(stationNum);							// 가고싶은 목적지 Num 세팅. 또한, 2차원 배열을 위한 칼럼 num 저장(나중의 "상세" 부분을 위해)
				stations[i].setStationName(destinations[stationNum-1]);			// 가고싶은 목적지 Name 세팅. 
				
				System.out.println(stations[i].getStationName());
			}
		}
		
		for(int j =0; j<4; j++) {									// 2차원 객체 배열의 각 요소 초기화 및 설정
																	// ** 지금 문제점 : 탑승하고 상세내역을 눌러야지 출력이 되고
			for(int i =0; i<5; i++) { 								// 탑승을 바로 여러번하고 나서 상세내역을 뒤늦게 누르면 마지막 것만 출력이 된다.
				
				if (i == stationNum-1 && j == sectionNum-1)			// 전역 변수 주의!! 선언하면 초기화 되어서..
					passengers[j][i].setpassengerRide(stations[i].getStationName());
			}
		}
		
		

	}

	private void move() {						
	
		// 1-1) 목적지 이동 후 현재역 출력을 위한 입력 부분  *****
		for(int i =0; i<5; i++) {									// 목적지 List 나열

			stations[i].setMoveCheck(true);
			
			if (destinations[i] == stations[0].getNextStation()) 	// 다음역 == 객체 배열 index
				nextStationList[i] = i;		
			
			if(nextStationList[i] == 4)
				nextStationList[i] = -1;
			
			stations[i].setNextStation(destinations[++nextStationList[i]]);
		
			
			
			
		}
		
		// 1-2) 탑승을 먼저 눌렀을 경우,현재역 출력을 위한 입력부분
		for(int i =0; i<5; i++) {									// 목적지 List 나열
			stations[i].setMoveCheck(true);
			
			if(stations[i].getJoinCheck() == true) {

				if (destinations[i] == stations[0].getNextStation()) { 	// 다음역 == 객체 배열 index
					nextStationList[i] = i;		
					
				if(nextStationList[i] == 4)
					nextStationList[i] = -1;
				
				stations[i].setNextStation(destinations[++nextStationList[i]]);
				
				
				}
			}
		}
		
		
		// 3) 지하철역 하차 로직 
		int dropCount = 0;

		for(int j =0; j<4; j++) {									// 2차원 객체 배열의 각 요소 초기화 및 설정
																	// ** 지금 문제점 : 탑승하고 상세내역을 눌러야지 출력이 되고
			for(int i =0; i<5; i++) { 								// 탑승을 바로 여러번하고 나서 상세내역을 뒤늦게 누르면 마지막 것만 출력이 된다.
			
				if(stations[0].getNextStation() == "합정역" && passengers[j][i].getpassengerRide() == "합정역") {
					passengers[j][i].setpassengerRide("없음");
					dropCount++;
				}
				
				else if(stations[0].getNextStation() == "홍대입구역" && passengers[j][i].getpassengerRide() == "홍대입구역") {
					passengers[j][i].setpassengerRide("없음");
					dropCount++;
				}
				else if(stations[0].getNextStation() == "신촌역" && passengers[j][i].getpassengerRide() == "신촌역") {
					passengers[j][i].setpassengerRide("없음");
					dropCount++;
				}
				else if(stations[0].getNextStation() == "이대역" && passengers[j][i].getpassengerRide() == "이대역") {
					passengers[j][i].setpassengerRide("없음");
					dropCount++;
				}
				else if(stations[0].getNextStation() == "아현역" && passengers[j][i].getpassengerRide() == "아현역") {
					passengers[j][i].setpassengerRide("없음");
					dropCount++;
				}
			}
		}
		
		System.out.printf("%d명이 하차했습니다.", dropCount);
		
		System.out.println();
		System.out.println("현재역은 " + stations[0].getNextStation() + "입니다.");
	}

	private void status() {

		
		// 4) 상세 내용을 보기 위한 로직

		for(int j =0; j<4; j++) {							// 2차원 객체 배열의 각 요소 초기화 및 설정
		
			for(int i =0; i<5; i++) { 

				if (i == 0) 
					System.out.printf("%d호차 : [%s] ", j+1, passengers[j][i].getpassengerRide());
				else
					System.out.printf("[%s] ", passengers[j][i].getpassengerRide());						
			}
			System.out.println();
		}

	}
}



2. 22.12.27 : 엘리베이터 설계 문제

package com.elevator.service;

public class ElevatorController {

	public static void main(String[] args) {
		
		ElevatorService es = new ElevatorService();
		
		System.out.println("---- Welcome Elevator ----");
		
		es.run();

	}

}

package com.elevator.service;

import java.util.Scanner;

public class ElevatorService {
	
	int[][] spaces = new int[3][4];
	int currentLayer = 1;
	int nextLayer = 1;
	
	boolean moveCheck = false;
	
	
	int count = 0;
	int rideoffcount = 0;

	int temp = 0;
	
	public void run() {
		
		Scanner scan = new Scanner(System.in);
		
		
		Tag:
		while(true) {
			System.out.println("\n\n======= 메뉴 선택 =======");
		
			System.out.println("1.탑승  2.이동  3.탑승현황  4.종료 > ");
			
			switch(scan.nextLine()) {
				case "1":
					join();
					break;
				case "2":
					move();
					break;
				case "3":
					detail();
					break;
				case "4":
					System.out.println("종료합니다.");
					break Tag;	
				default:
					System.out.println("잘못 입력하셨습니다.");
			}	
		}
			
	}
	
	private void join() {
		Scanner scan = new Scanner(System.in);
		System.out.println("가고싶은 층수를 선택해주세요.");
		System.out.println("1.1층 2.2층 3.3층 >");
		
		
		nextLayer = scan.nextInt();
			
		System.out.printf("입력하신 층은 %d층 입니다.\n", nextLayer);
		
		for(int j=0; j<3; j++) {
			for(int i=0; i<4; i++) {
				if(j == nextLayer-1 && i == 0) {
					spaces[j][i]++;
					count++;
					
					if(spaces[j][i] == 4) {
						System.out.printf("====== 더이상 탑승할 공간이 없습니다. ======");
						return;
					}
				}
 			}
		}
		
			
	}
	
	private void detail() {
		System.out.println("======= 탑승 현황 =======");
		
		if((count-rideoffcount) != 0)
			System.out.printf("현재 탑승 인원은 %d명 입니다.\n", count-rideoffcount);
		else if(count-rideoffcount == 0)
			System.out.print("현재 탑승 인원은 0명 입니다.\n");
		
		System.out.printf("현재 층수는 %d층 입니다.\n", currentLayer);
			
	}

	private void move() {
		

		if(moveCheck == false) { 
			currentLayer++;
			
			if(currentLayer == 4) 
				moveCheck = true;
				//return;
		}
		

		if(moveCheck == true) { 
			currentLayer--;
			
			if(currentLayer == 1) 
				moveCheck = false;
				//return;
		}
		
		for(int j=0; j<3; j++) 
			for(int i=0; i<4; i++) 
				if(j == currentLayer-1 && i == 0) { 
					spaces[j][i]--;
					rideoffcount++;
				}
		
		if((count-rideoffcount) != 0)
			System.out.printf("%d명이 하차했습니다.\n", rideoffcount);
		else if(count-rideoffcount == 0)
			System.out.print("0명이 하차했습니다.\n");
	
	}

}







3. 22.12.28

1) javascript 복습 문제

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script>
        // 5이하 alert로 출력
        // for(var i = 0; i<5; i++){
        //     alert(i+1);
        // }

        // JS에서 if문 사용법
        // for(var i = 0; i<10; i++){
        //     if(i<=5)
        //         alert("Good");
        //     else if(i>=6 && i<=8)
        //         alert("Nice");
        //     else 
        //         alert("yes");
        // }
        
        // JS에서 while문 사용법
        while(i<=5){
            console.log(i+1);
            i++
        }

        // 1부터 10까지 배열로 표현
        var arr = [1,2,3,4,5,6,7,8,9,10];
        console.log(arr);


        // 1부터 10까지 객체로 표현하기
        // 자바스크립트에서 Object는 JSON, eval인데 eval은 위험해서 데이터 타입을 쓸때는 JSON 쓰자.
        var obj = JSON.parse("[1,2,3,4,5,6,7,8,9,10]");

        for(var i = 0; i<10; i++){
            console.log(obj[i]);
        }

        // a,b,c 오름차순 만들기 (temp 이용해서)
        var a = 5;
        var b = 8;
        var c = 3;

        var temp = 0;

        for(var i=0; i<3; i++) {

            if(a>b){
                temp = a;
                a = b;
                b = temp;
            }
            else if(b>c){
                temp = b;
                b = c;
                c = temp;
            }
            else if(a>c){
                temp = c;
                c = a;
                a = temp;
            }
        }

        console.log(a);
        console.log(b);
        console.log(c);

        // 내림차순
        var arr =[5,7,3]
        var temp1;

        for(var i= 0; i<arr.length; i++){
            if(arr[i+1]>arr[i]){
                temp1 = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp1;
            }
            console.log(arr[i]);

        }
        
        // prompt가 입력값 받게해주는 역할을 해준다.
        var age = prompt("나이를 입력해주세요.");
        
        switch(age){
            case '18':
                alert("낭랑 18세이네...");
                break;

            case '19':
                alert("성인이네...");
                break;

            default :
                alert("잘못 입력");
        }


        // 객체 만들고 반환(나는 JSON으로 만듬)
        // *** 웹의 데이터를 가져올때, 이런식으로 가져오거나 가져다 준다!!

        var user = {"name": "json", "age": 30, "addr": "bro"};
        console.log(user.addr);



        // 공공 데이터 이용하는 JSON 데이터 타입 //  for in, for of 이용하기(키의 값인지 키 값인지 비교)

        var stations = [{"sgg_cd":"1114000000","emd_nm":"봉래동2가","node_code":"1","emd_cd":"1114012000","node_wkt":"POINT(126.97279432094167 37.5550080901334)","sgg_nm":"중구","type":"NODE","sw_nm":null,"sw_cd":null,"node_id":177923},
{"sgg_cd":"1114000000","emd_nm":"봉래동2가","node_code":"1","emd_cd":"1114012000","node_wkt":"POINT(126.97206655819348 37.55632725997717)","sgg_nm":"중구","type":"NODE","sw_nm":"서울역","sw_cd":"284","node_id":15251},
{"sgg_cd":"1114000000","emd_nm":"을지로4가","node_code":"1","emd_cd":"1114015000","node_wkt":"POINT(126.99753408814574 37.566489380284985)","sgg_nm":"중구","type":"NODE","sw_nm":"을지로4가","sw_cd":"285","node_id":7015}];

        for (var k in stations) 
            console.log(stations[k].node_id);
    
        
        for (var v of stations) 
            console.log(v);
        
        // JS의 parseInt는 + 형태로 문자열을 구성하여도 각각을 숫자로 바꿔서 계산해주지만,
        // 자바에서의 Integer.parseInt()는 + 형태로 문자열을 구성하면, 각각을 숫자로 바꿔주지 않는다. +가 있으면 동작하지 않음.
        // int j = 1;
		// System.out.println();
		// System.out.println(Integer.parseInt(j+"1"));

        // ***결론 : JS가 더 유연하다.




        // 현재시간 및 날짜 입력하기 (Date 객체를 만들어서 Data 객체의 함수이용하기)

        var date1 = new Date();
        var date2 = new Date(2007,11,24,3,48);
        var date3 = new Date('2022-05-03');             // .getMonth()는 0부터 11까지 출력된다.
        var date4 = new Date('2022-05-04 10:20:30');

        console.log(date4);

        var y = date4.getFullYear();
        var m = date4.getMonth();

        console.log(y);             //2022
        console.log(m);             //4가 출력(원래는 5월인데) .getMonth()는 0부터 11까지 출력된다.

    </script>


</head>
<body>
    
</body>
</html>