본문 바로가기

[과제] 호텔 예약 프로그램

1. 조건


[1] 기본 기능

room.txt 의 내용을 읽어 출력합니다.

검색기능은 다음과 같이 동작합니다.

==========================================

검색방법: 키워드나 가격, 숙박인원, 넓이, 온돌/침대

가격 검색은 50000원 처럼 끝에 "원"을 입력

인원 검색은 4명 처럼 끝에 "명"을 입력

넓이 검색은 10평 처럼 끝에 "평"을 입력

방 유형은 "온돌" 이나 "침대"처럼 입력

붙여서 써주세요. 나머지 단어는 키워드로 검색됩니다.

==========================================


[2] 참고사항

1. 키워드에서 끝에 한글자만 떼내는 방법

   digits = kwd.substring(0, kwd.length()-1);

   kwd = kwd.substring(kwd.length()-1);


2. 문자열 안에 따옴표 넣는 방법

   System.out.println("넓이 검색은 10평 처럼 끝에 \"평\"을 입력");


3. 침대 와 온돌 검색

   방 수가 침대수보다 많으면 온돌로 검색

   침대 수가 1 이상이면 침대로 검색


[3] <<도전 과제>>

다음과 같이 여러 개의 키워드를 받아서(end면 종료) 

모두 만족하는 방을 찾는 기능을 만들어 보세요.

(Tip) 키워드 하나씩 처리하면서 만족하지 않는 방을 뺀다.

>> 4명 15평 end

그린 70000원 (15평) 최대인원 4명, 방2개 침대 3개 욕실 1개

    방 2개, 침실 3개, 넉넉한 공간 / 마운틴뷰

화이트 200000원 (24평) 최대인원 4명, 방2개 침대 1개 욕실 2개

    거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰

>> 100000원 4명 end

그린 70000원 (15평) 최대인원 4명, 방2개 침대 3개 욕실 1개

    방 2개, 침실 3개, 넉넉한 공간 / 마운틴뷰

>> 10평 바다뷰 80000원 end

조건에 만족하는 방이 없습니다.


>> 10평 바다뷰 100000원 end

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 2개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 0개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

>> 10평 바다뷰 100000원 온돌 end

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 0개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

>>


[4] 검색 방법

키워드나 가격, 숙박인원, 넓이, 온돌/침대

가격 검색은 50000원 처럼 끝에 "원"을 입력

인원 검색은 4명 처럼 끝에 "명"을 입력

넓이 검색은 10평 처럼 끝에 "평"을 입력

방 유형은 "온돌" 이나 "침대"처럼 입력

붙여서 써주세요. 나머지 단어는 키워드로 검색됩니다.




2. room.txt의 내용


룸 개수: 7

블루 30000 8 2 1 0 1 온돌과 욕실 / 바다뷰

퍼플 30000 8 2 1 1 1 침대방 욕실 / 마운틴뷰

레드 50000 12 2 1 2 1 침대방 욕실 / 마운틴뷰

그린 70000 15 4 2 3 1 방 2개, 침실 3개, 넉넉한 공간 / 마운틴뷰

브라운 100000 15 2 2 2 1 다락방이 있는 아늑한 분위기 / 바다뷰

브라운 100000 15 2 2 0 1 다락방이 있는 아늑한 분위기 / 바다뷰

화이트 200000 24 4 2 1 2 거실, 방, 욕실 2개, 다락방, 넓은 스위트룸




3. 출력 형식


============= 숙박 선택 ===============

블루 30000원 (8평) 최대인원 2명, 방1개 침대 0개 욕실 1개

    온돌과 욕실 / 바다뷰

퍼플 30000원 (8평) 최대인원 2명, 방1개 침대 1개 욕실 1개

    침대방 욕실 / 마운틴뷰

레드 50000원 (12평) 최대인원 2명, 방1개 침대 2개 욕실 1개

    침대방 욕실 / 마운틴뷰

그린 70000원 (15평) 최대인원 4명, 방2개 침대 3개 욕실 1개

    방 2개, 침실 3개, 넉넉한 공간 / 마운틴뷰

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 2개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 0개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

화이트 200000원 (24평) 최대인원 4명, 방2개 침대 1개 욕실 2개

    거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰


>>  블루

블루 30000원 (8평) 최대인원 2명, 방1개 침대 0개 욕실 1개

    온돌과 욕실 / 바다뷰

>>  다락방

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 2개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 0개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

화이트 200000원 (24평) 최대인원 4명, 방2개 침대 1개 욕실 2개

    거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰

>>  아늑한

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 2개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 0개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

>>  넓은   

화이트 200000원 (24평) 최대인원 4명, 방2개 침대 1개 욕실 2개

    거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰

>>  20평

화이트 200000원 (24평) 최대인원 4명, 방2개 침대 1개 욕실 2개

    거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰

>> 4명

그린 70000원 (15평) 최대인원 4명, 방2개 침대 3개 욕실 1개

    방 2개, 침실 3개, 넉넉한 공간 / 마운틴뷰

화이트 200000원 (24평) 최대인원 4명, 방2개 침대 1개 욕실 2개

    거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰

>> 30000원

블루 30000원 (8평) 최대인원 2명, 방1개 침대 0개 욕실 1개

    온돌과 욕실 / 바다뷰

퍼플 30000원 (8평) 최대인원 2명, 방1개 침대 1개 욕실 1개

    침대방 욕실 / 마운틴뷰

>> 50000원

블루 30000원 (8평) 최대인원 2명, 방1개 침대 0개 욕실 1개

    온돌과 욕실 / 바다뷰

퍼플 30000원 (8평) 최대인원 2명, 방1개 침대 1개 욕실 1개

    침대방 욕실 / 마운틴뷰

레드 50000원 (12평) 최대인원 2명, 방1개 침대 2개 욕실 1개

    침대방 욕실 / 마운틴뷰

>> 온돌

블루 30000원 (8평) 최대인원 2명, 방1개 침대 0개 욕실 1개

    온돌과 욕실 / 바다뷰

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 0개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

화이트 200000원 (24평) 최대인원 4명, 방2개 침대 1개 욕실 2개

    거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰

>>  침대

퍼플 30000원 (8평) 최대인원 2명, 방1개 침대 1개 욕실 1개

    침대방 욕실 / 마운틴뷰

레드 50000원 (12평) 최대인원 2명, 방1개 침대 2개 욕실 1개

    침대방 욕실 / 마운틴뷰

그린 70000원 (15평) 최대인원 4명, 방2개 침대 3개 욕실 1개

    방 2개, 침실 3개, 넉넉한 공간 / 마운틴뷰

브라운 100000원 (15평) 최대인원 2명, 방2개 침대 2개 욕실 1개

    다락방이 있는 아늑한 분위기 / 바다뷰

화이트 200000원 (24평) 최대인원 4명, 방2개 침대 1개 욕실 2개

    거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰

>>



4. 과제 수행


내 과제는 아니고 친구 과제인데 밥 사주는 조건으로 과제를 해준다 했다.

사실 자바의 파일 입출력은 공부하지 않은 상태라 좀 애먹었다.

기본적으로 read() 메소드로 읽어오는데, 이 메소드는 무조건 1바이트씩 읽어온다.

3바이트인 한글을 어떻게 읽어오는지 모르겠어서 여러 방법을 조사해 그대로 사용해봤지만 읽어와지지 않았다. 방법을 더 조사해볼 의향은 있었지만 나도 파일 입출력에 아직 익숙하지 않았고 제출 기한도 얼마 안 남아서 그냥 숫자에 매핑하기로 했다.


우선 방 클래스를 만들었다. 방 클래스에는 색, 가격, 최대 인원 등의 필드가 있고, 색과 같은 한글 텍스트는 문자열 배열에 미리 저장해둔 다음 인덱스로 매핑했다.


[1] room.txt

7

0 30000 8 2 1 0 1 0

1 30000 8 2 1 1 1 1

2 50000 12 2 1 2 1 1

3 70000 15 4 2 3 1 2

4 100000 15 2 2 2 1 3

4 100000 15 2 2 0 1 3

5 200000 24 4 2 1 2 4


[2] Room 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class Room {
    private String color;
    private String price;
    private String area;
    private String max;
    private String rooms;
    private String beds;
    private String bathrooms;
    private String info;
    
    public static String[] colors = {"블루""퍼플""레드""그린""브라운""화이트"};
    public static String[] infoes = {
            "온돌과 욕실 / 바다뷰",
            "침대방 욕실 / 마운틴뷰"
            "방 2개, 침실 3개, 넉넉한 공간 / 마운틴뷰"
            "다락방이 있는 아늑한 분위기 / 바다뷰"
            "거실, 방, 욕실 2개, 다락방, 넓은 스위트룸 / 바다뷰",  
            };
    
     
    public Room(String color, String price, String area, String max, String rooms, String beds, String bathrooms, String info) {
        this.color = color;
        this.price = price;
        this.area = area;
        this.max = max;
        this.rooms = rooms;
        this.beds = beds;
        this.bathrooms = bathrooms;
        this.info = info;
    }
    
    public String getColor() { return color; }
    public void setColor(String color) { this.color = color; }
 
    public String getPrice() { return price; }
    public void setPrice(String price) { this.price = price; }
 
    public String getArea() { return area; }
    public void setArea(String area) { this.area = area;}
 
    public String getMax() { return max; }
    public void setMax(String max) { this.max = max; }
 
    public String getRooms() { return rooms; }
    public void setRooms(String rooms) { this.rooms = rooms; }
 
    public String getBeds() { return beds; }
    public void setBed(String beds) { this.beds = beds; }
 
    public String getBathrooms() { return bathrooms; }
    public void setBathrooms(String bathrooms) { this.bathrooms = bathrooms; }
    
    public String getInfo() { return info; }
    public void setInfo(String info) { this.info = info; }
}
cs




[2] 실행 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
 
public class Example {
 
    public static void main(String[] args) throws Exception {
        File file = new File("../room.txt");
        
        if(file.canRead() && file.exists()) {
            FileReader reader = new FileReader(file);
            int len = reader.read() - '0';
            char[] data = new char[200];
            int idx = 2;
            int start;
            Room[] rooms = new Room[len];
            String temp = null;
            StringTokenizer st = null;
            String keyword;
            Scanner scanner = new Scanner(System.in);
            List<Room> result = new ArrayList<Room>();
                    
            while(reader.read(data) != -1);
            
            for(int i = 0; i < len; i++) {
                temp = null;
                
                start = idx;
                while((data[idx++!= '\r'));
    
                temp = new String(data, start, (--idx - start)); idx += 2;
                
                st = new StringTokenizer(temp, " ");
                while(st.hasMoreTokens()) {
                    rooms[i] = new Room(
                            Room.colors[Integer.parseInt(st.nextToken())],
                            st.nextToken() + "원",
                            st.nextToken() + "평",
                            st.nextToken() + "명",
                            st.nextToken() + "개",
                            st.nextToken() + "개",
                            st.nextToken() + "개",
                            Room.infoes[Integer.parseInt(st.nextToken())]
                            );
                }
                
                System.out.println(rooms[i].getColor() + " " + rooms[i].getPrice() + " (" +  
                        rooms[i].getArea() + ") 최대인원 " + rooms[i].getMax() + ", 방 " + rooms[i].getRooms() + " 침대 " 
                        + rooms[i].getBeds() + " 화장실 " + rooms[i].getBathrooms() + "\n\t" +  rooms[i].getInfo()
                        );
                
            }
            
            do {
                System.out.print(">> ");
                keyword = scanner.nextLine();
            } while(keyword.contains("end"));
            
            st = new StringTokenizer(keyword, " ");
            while(st.hasMoreTokens()) {
                keyword = st.nextToken();
                
                for(int i = 0; i < len; i++) {
                    if(keyword.equals(rooms[i].getColor()) ||
                            keyword.equals(rooms[i].getPrice()) ||
                            keyword.equals(rooms[i].getArea()) ||
                            keyword.equals(rooms[i].getMax()) ||
                            keyword.equals(rooms[i].getRooms()) ||
                            keyword.equals(rooms[i].getBeds()) ||
                            keyword.equals(rooms[i].getBathrooms()) ||
                            rooms[i].getInfo().contains(keyword)) {
                        if(!result.contains(rooms[i])) {
                            result.add(rooms[i]);
                        }
                    }
                }
            }
            
            for(int i = 0; i < result.size(); i++) {
                System.out.println(result.get(i).getColor() + " " + result.get(i).getPrice() + " (" +  
                        result.get(i).getArea() + ") 최대인원 " + result.get(i).getMax() + ", 방 " + result.get(i).getRooms() + " 침대 " 
                        + result.get(i).getBeds() + " 화장실 " + result.get(i).getBathrooms() + "\n\t" +  result.get(i).getInfo()
                        );
            }
            
            reader.close();
scanner.close();
        }
    }
 
}
cs


제출 기한에 맞추느라 뚝딱뚝딱 짠 코드라 정답인지는 모르겠다. 그래도 검색은 제대로 되는 것 같다.

공짜밥 신난당 

'Programming > Java' 카테고리의 다른 글

Managed code  (0) 2019.07.04
IO 입출력  (0) 2019.05.23
자바에서의 배열 선언 및 초기화  (0) 2019.05.08
BigInteger 클래스  (0) 2019.04.17
용어 정리  (0) 2019.04.08