도서관 대출 시스템
문제
도서 목록과 회원 목록이 주어진다. 이후 다음 명령을 처리하라.
BORROW member_id book_id
RETURN book_id
PRINT_BOOK book_id
PRINT_MEMBER member_id
각 명령의 의미는 다음과 같다.
BORROW member_id book_id
: 아래 조건을 모두 만족하면 대출에 성공한다.
- 그 book_id의 책이 존재한다.
- 그 member_id의 회원이 존재한다.
- 책이 현재 대출 중이 아니다.
- 회원의 현재 대출 권수(current)가 한도(limit)보다 작다.
성공하면 책을 대출 중으로 표시하고 borrowerId를 그 회원으로 정하며,
회원의 current를 1 늘린 뒤 OK를 출력한다.
하나라도 만족하지 못하면 상태를 바꾸지 않고 FAIL을 출력한다.
RETURN book_id
: 그 책이 존재하고 현재 대출 중이면, 책을 대출 가능 상태로 되돌리고
빌렸던 회원의 current를 1 줄인 뒤 OK를 출력한다.
책이 없거나 대출 중이 아니면 FAIL을 출력한다.
PRINT_BOOK book_id
: 책의 상태를 출력한다.
PRINT_MEMBER member_id
: 회원의 현재 대출 권수를 출력한다.
입력
B
book_id title
...
M
member_id name limit
...
Q
command
...
출력
BORROW, RETURN은 성공하면 OK, 실패하면 FAIL을 출력한다.
PRINT_BOOK은 대출 가능하면 다음 형식으로 출력한다.
title AVAILABLE 0
대출 중이면 다음 형식으로 출력한다.
title BORROWED 빌린회원id
PRINT_MEMBER는 다음 형식으로 출력한다.
name current
제한
1 <= B, M <= 50
1 <= Q <= 100
1 <= book_id, member_id <= 100000
title 길이 <= 29
name 길이 <= 19
0 <= limit <= 50
id는 종류별로 중복되지 않는다.
PRINT_BOOK에서 참조하는 book_id는 항상 존재한다.
PRINT_MEMBER에서 참조하는 member_id는 항상 존재한다.
예제 입력
3
1 Cbook
2 Algo
3 Data
2
10 Kim 2
20 Lee 1
8
BORROW 10 1
BORROW 20 1
BORROW 20 2
PRINT_BOOK 1
PRINT_MEMBER 10
RETURN 1
BORROW 20 1
PRINT_BOOK 1
예제 출력
OK
FAIL
OK
Cbook BORROWED 10
Kim 1
OK
FAIL
Cbook AVAILABLE 0
힌트 보기
typedef struct {
int id;
char title[30];
int borrowed;
int borrowerId;
} Book;
typedef struct {
int id;
char name[20];
int limit;
int current;
} Member;
코멘트