Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.55 KB | None | 0 0
  1. // Swift 버전입니다.
  2.  
  3. import Foundation
  4.  
  5. class Theater: Equatable {
  6. static func == (lhs: Theater, rhs: Theater) -> Bool {
  7. return lhs.name == rhs.name
  8. }
  9.  
  10. private var ticketOffices = [TicketOffice]()
  11. private var movies = [Movie]()
  12. let name: String
  13. init(name: String) {
  14. self.name = name
  15. }
  16.  
  17. func getPrice(movie: Movie) -> Int? {
  18. guard movies.contains(movie) else { return nil }
  19. return movie.price
  20. }
  21.  
  22. func setTicketOffices(_ ticketOffices: [TicketOffice]) {
  23. self.ticketOffices = ticketOffices
  24. }
  25.  
  26. func setMovies(_ movies: [Movie]) {
  27. self.movies = movies
  28. }
  29.  
  30. func setTicket(ticketOffice: TicketOffice, count: Int, for movie: Movie) {
  31. guard ticketOffices.contains(ticketOffice), movies.contains(movie) else { return }
  32. for _ in stride(from: count, to: 0, by: -1) { ticketOffice.addTicket(Ticket(theater: self, movie: movie)) }
  33. }
  34.  
  35. func setInvitation(audience: Audience, movie: Movie) {
  36. audience.setInvitation(Invitation(theater: self, movie: movie))
  37. }
  38.  
  39. func enter(audience: Audience) -> Bool {
  40. guard let ticket = audience.getTicket() else { return false }
  41. return ticket.isValid(theater: self)
  42. }
  43. }
  44.  
  45. struct Movie: Equatable {
  46. let name: String
  47. let price: Int
  48. init(name: String, price: Int) {
  49. self.name = name
  50. self.price = price
  51. }
  52. }
  53.  
  54. class Ticket {
  55. let theater: Theater
  56. let movie: Movie
  57. private var isEntered = false
  58. init(theater: Theater, movie: Movie) {
  59. self.theater = theater
  60. self.movie = movie
  61. }
  62.  
  63. func isValid(theater: Theater) -> Bool {
  64. guard !isEntered, theater == self.theater else { return false }
  65. isEntered = true
  66. return true
  67. }
  68.  
  69. func getPrice() -> Int {
  70. return movie.price
  71. }
  72. }
  73.  
  74. class Invitation {
  75. let theater: Theater
  76. let movie: Movie
  77. init(theater: Theater, movie: Movie) {
  78. self.theater = theater
  79. self.movie = movie
  80. }
  81. }
  82.  
  83. class TicketOffice: Equatable {
  84. static func == (lhs: TicketOffice, rhs: TicketOffice) -> Bool {
  85. return lhs.theater.name == rhs.theater.name
  86. }
  87.  
  88. let theater: Theater
  89. private var tickets = [Ticket]()
  90. private var amount: Int
  91.  
  92. init(theater: Theater, amount: Int) {
  93. self.theater = theater
  94. self.amount = amount
  95. }
  96.  
  97. func addTicket(_ ticket: Ticket) {
  98. self.tickets.append(ticket)
  99. }
  100.  
  101. func getTicketWithFee(_ movie: Movie) -> Ticket? {
  102. guard let idx = tickets.firstIndex(where: { $0.movie == movie }) else { return nil }
  103. let ticket = tickets.remove(at: idx)
  104. amount += ticket.getPrice()
  105. return ticket
  106. }
  107.  
  108. func getTicketWithoutFee(_ movie: Movie) -> Ticket? {
  109. guard let idx = tickets.firstIndex(where: { $0.movie == movie }) else { return nil }
  110. return tickets.remove(at: idx)
  111. }
  112.  
  113. func getTicketPrice(_ movie: Movie) -> Int? {
  114. guard let ticket = tickets.filter({ $0.movie == movie }).first else { return nil }
  115. return ticket.getPrice()
  116. }
  117. }
  118.  
  119. class TicketSeller {
  120. private var ticketOffice: TicketOffice?
  121. func setTicketOffice(_ ticketOffice: TicketOffice) {
  122. self.ticketOffice = ticketOffice
  123. }
  124.  
  125. func getTicket(audience: Audience, movie: Movie) -> Ticket? {
  126. guard let ticketOffice = self.ticketOffice, let price = ticketOffice.getTicketPrice(movie) else { return nil }
  127. if let invitation = audience.getInvitation(), invitation.movie == movie, let ticket = ticketOffice.getTicketWithoutFee(movie) {
  128. audience.removeInvitation()
  129. return ticket
  130. }
  131. if audience.hasAmount(price), let ticket = ticketOffice.getTicketWithFee(movie), audience.minusAmount(price) {
  132. return ticket
  133. }
  134. return nil
  135. }
  136. }
  137.  
  138. class Audience {
  139. private var invitation: Invitation?
  140. private var ticket: Ticket?
  141.  
  142. private var amount: Int
  143. init(amount: Int) {
  144. self.amount = amount
  145. }
  146.  
  147. func buyTicket(seller: TicketSeller, movie: Movie) {
  148. ticket = seller.getTicket(audience: self, movie: movie)
  149. }
  150.  
  151. func getTicket() -> Ticket? {
  152. return self.ticket
  153. }
  154.  
  155. func hasAmount(_ amount: Int) -> Bool {
  156. return self.amount >= amount
  157. }
  158.  
  159. func minusAmount(_ amoun: Int) -> Bool {
  160. guard self.amount >= amount else { return false }
  161. self.amount -= amount
  162. return true
  163. }
  164.  
  165. func getInvitation() -> Invitation? {
  166. return self.invitation
  167. }
  168. func setInvitation(_ invitation: Invitation) {
  169. self.invitation = invitation
  170. }
  171. func removeInvitation() {
  172. self.invitation = nil
  173. }
  174. }
  175.  
  176. let cgv = Theater(name: "CGV")
  177. let spiderMan = Movie.init(name: "SpiderMan", price: 10000)
  178. let lionKing = Movie.init(name: "LionKing", price: 9000)
  179. let ticketOffice = TicketOffice(theater: cgv, amount: 0)
  180.  
  181. let seller = TicketSeller()
  182. seller.setTicketOffice(ticketOffice)
  183.  
  184. let audience1 = Audience(amount: 8000)
  185. let audience2 = Audience(amount: 15000)
  186.  
  187. cgv.setTicketOffices([ticketOffice])
  188. cgv.setMovies([spiderMan, lionKing])
  189. cgv.setTicket(ticketOffice: ticketOffice, count: 500, for: spiderMan)
  190. cgv.setTicket(ticketOffice: ticketOffice, count: 300, for: lionKing)
  191. cgv.setInvitation(audience: audience1, movie: lionKing)
  192.  
  193. audience1.buyTicket(seller: seller, movie: spiderMan)
  194. audience2.buyTicket(seller: seller, movie: lionKing)
  195.  
  196. let isOK1 = cgv.enter(audience: audience1)
  197. let isOK2 = cgv.enter(audience: audience2)
  198.  
  199. print(isOK1) // false -> 돈이 없고 invitation을 lionKing 을 받았는데 spiderMan을 보고 싶어함
  200. print(isOK2) // true 돈이 많음
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement