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 |