From 0f5b78c054cc8a89ff8a3850910e27b6aecd430d Mon Sep 17 00:00:00 2001 From: ujhong7 Date: Wed, 31 Jan 2024 16:19:35 +0900 Subject: [PATCH 01/33] =?UTF-8?q?feat:=20Queue=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EC=9D=84=20=EC=9C=84=ED=95=9C=20Linked-list?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EA=B5=AC=ED=98=84=20=ED=9B=84=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 32 +++++++++-- .../Queue/LinkedList.swift | 53 +++++++++++++++++++ .../BankManagerConsoleApp/Queue/Node.swift | 18 +++++++ .../BankManagerConsoleApp/Queue/Queue.swift | 38 +++++++++++++ 4 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift diff --git a/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj b/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj index 6b40a668..4e36feb4 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj +++ b/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj @@ -7,8 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 1D9C82D72B6A2B1C0047245E /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9C82D62B6A2B1C0047245E /* Node.swift */; }; + 1D9C82D92B6A2B270047245E /* LinkedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9C82D82B6A2B270047245E /* LinkedList.swift */; }; + 1D9C82DB2B6A2B2F0047245E /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9C82DA2B6A2B2F0047245E /* Queue.swift */; }; C7694E7A259C3EC00053667F /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7694E79259C3EC00053667F /* main.swift */; }; - C7D65D1B259C8190005510E0 /* BankManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7D65D1A259C8190005510E0 /* BankManager.swift */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -24,9 +26,11 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1D9C82D62B6A2B1C0047245E /* Node.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Node.swift; sourceTree = ""; }; + 1D9C82D82B6A2B270047245E /* LinkedList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkedList.swift; sourceTree = ""; }; + 1D9C82DA2B6A2B2F0047245E /* Queue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = ""; }; C7694E76259C3EC00053667F /* BankManagerConsoleApp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BankManagerConsoleApp; sourceTree = BUILT_PRODUCTS_DIR; }; C7694E79259C3EC00053667F /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; - C7D65D1A259C8190005510E0 /* BankManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BankManager.swift; path = ../../BankManager.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -40,6 +44,23 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1D9C82D42B6A2AD00047245E /* Queue */ = { + isa = PBXGroup; + children = ( + 1D9C82D62B6A2B1C0047245E /* Node.swift */, + 1D9C82D82B6A2B270047245E /* LinkedList.swift */, + 1D9C82DA2B6A2B2F0047245E /* Queue.swift */, + ); + path = Queue; + sourceTree = ""; + }; + 1D9C82D52B6A2AF00047245E /* Bank */ = { + isa = PBXGroup; + children = ( + ); + path = Bank; + sourceTree = ""; + }; C7694E6D259C3EC00053667F = { isa = PBXGroup; children = ( @@ -59,8 +80,9 @@ C7694E78259C3EC00053667F /* BankManagerConsoleApp */ = { isa = PBXGroup; children = ( - C7D65D1A259C8190005510E0 /* BankManager.swift */, C7694E79259C3EC00053667F /* main.swift */, + 1D9C82D42B6A2AD00047245E /* Queue */, + 1D9C82D52B6A2AF00047245E /* Bank */, ); path = BankManagerConsoleApp; sourceTree = ""; @@ -122,8 +144,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1D9C82D92B6A2B270047245E /* LinkedList.swift in Sources */, C7694E7A259C3EC00053667F /* main.swift in Sources */, - C7D65D1B259C8190005510E0 /* BankManager.swift in Sources */, + 1D9C82D72B6A2B1C0047245E /* Node.swift in Sources */, + 1D9C82DB2B6A2B2F0047245E /* Queue.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift new file mode 100644 index 00000000..69ae76ef --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift @@ -0,0 +1,53 @@ +// +// LinkedList.swift +// BankManagerConsoleApp +// +// Created by yujaehong on 1/31/24. +// + +import Foundation + +class LinkedList { + var front: Node? + var rear: Node? + + init(front: Node? = nil, rear: Node? = nil) { + self.front = front + self.rear = rear + } + + var first: T? { + return front?.value + } + + var isEmpty: Bool { + return front == nil + } +} + +extension LinkedList { + func append(_ value: T) { + let newNode = Node(value) + + if isEmpty { + front = newNode + rear = front + } else { + rear?.next = newNode + rear = newNode + } + } + + func removeFirst() -> T? { + guard let currentFront = front else { return nil } + front = front?.next + return currentFront.value + } + + func removeAll() { + front = nil + rear = nil + } +} + + diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift new file mode 100644 index 00000000..6539e582 --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift @@ -0,0 +1,18 @@ +// +// Node.swift +// BankManagerConsoleApp +// +// Created by yujaehong on 1/31/24. +// + +import Foundation + +class Node { + var value: T + var next: Node? + + init(_ value: T, _ next: Node? = nil) { + self.value = value + self.next = next + } +} diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift new file mode 100644 index 00000000..11907dfe --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift @@ -0,0 +1,38 @@ +// +// Queue.swift +// BankManagerConsoleApp +// +// Created by yujaehong on 1/31/24. +// + +import Foundation + +class Queue { + var linkedList: LinkedList + + init(linkedList: LinkedList = LinkedList()) { + self.linkedList = linkedList + } +} + +extension Queue { + func enqueue(_ value: T) { + linkedList.append(value) + } + + func dequeue() -> T? { + return linkedList.removeFirst() + } + + func clear() { + linkedList.removeAll() + } + + func peek() -> T? { + return linkedList.first + } + + func isEmpty() -> Bool { + return linkedList.isEmpty + } +} From d667351e9426d86e1a7595333f523aeef12cac0d Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Wed, 31 Jan 2024 17:25:05 +0900 Subject: [PATCH 02/33] =?UTF-8?q?feat:=20Bank=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1,=20open,=20processCustomer=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Bank.swift | 37 +++++++++++++++++++ .../BankManagerConsoleApp/Bank/Banker.swift | 8 ++++ .../BankManagerConsoleApp/Bank/Customer.swift | 8 ++++ .../BankManagerConsoleApp/Double+.swift | 14 +++++++ 4 files changed, 67 insertions(+) create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift new file mode 100644 index 00000000..0c966d8d --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift @@ -0,0 +1,37 @@ +// +// Bank.swift +// BankManagerConsoleApp +// +// Created by dopamint on 1/31/24. +// + +import Foundation + +class Bank { + let banker = Banker() + var customerQueue = Queue() + + func open() { + print("은행 문이 열렸습니다.") + let numberOfCustomers = Int.random(in: 1...10) + + print("고객 수: \(numberOfCustomers)") + for customerNumber in 1...numberOfCustomers { + let customer = Customer(number: customerNumber) + customerQueue.enqueue(customer) + } + + processCustomers() + let totalDurationTimeFormatted = banker.totalDuration.formattedDecimal + print("업무가 마감되었습니다. 오늘 업무를 처리한 고객은 총 \(numberOfCustomers)명이며, 총 업무시간은 \(totalDurationTimeFormatted)초입니다.") + banker.totalDuration = 0.0 + } + + func processCustomers() { + while !customerQueue.isEmpty() { + if let customer = customerQueue.dequeue() { + banker.processCustomer(customer) + } + } + } +} diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift new file mode 100644 index 00000000..f93f7899 --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift @@ -0,0 +1,8 @@ +// +// Banker.swift +// BankManagerConsoleApp +// +// Created by dopamint on 1/31/24. +// + +import Foundation diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift new file mode 100644 index 00000000..18bfee5a --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift @@ -0,0 +1,8 @@ +// +// Customer.swift +// BankManagerConsoleApp +// +// Created by dopamint on 1/31/24. +// + +import Foundation diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift new file mode 100644 index 00000000..f6e92199 --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift @@ -0,0 +1,14 @@ +// +// String+.swift +// BankManagerConsoleApp +// +// Created by dopamint on 1/31/24. +// + +import Foundation + +extension Double { + var formattedDecimal: String { + return String(format: "%.2f", self) + } +} From 2e54e5f267eadcfe29fbbb2879409c09cbb09e86 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Wed, 31 Jan 2024 17:26:46 +0900 Subject: [PATCH 03/33] =?UTF-8?q?feat:=20Banker=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Banker.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift index f93f7899..230b3451 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift @@ -6,3 +6,14 @@ // import Foundation + +class Banker { + let duration = 0.7 + var totalDuration = 0.0 + func processCustomer(_ customer: Customer) { + print("\(customer.number)번 고객 업무 시작") + Thread.sleep(forTimeInterval: duration) + print("\(customer.number)번 고객 업무 끝") + totalDuration += duration + } +} From bba8e7d55937097e729436f622862582bf9e43b2 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Wed, 31 Jan 2024 17:27:11 +0900 Subject: [PATCH 04/33] =?UTF-8?q?feat:=20Customer=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Customer.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift index 18bfee5a..3d12422b 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift @@ -6,3 +6,11 @@ // import Foundation + +class Customer { + let number: Int + + init(number: Int) { + self.number = number + } +} From ec07b48912dc0c754ed33ec7c86abf960a029a95 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Wed, 31 Jan 2024 17:28:05 +0900 Subject: [PATCH 05/33] =?UTF-8?q?feat:=20operation=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/main.swift | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift index 1aa9854c..c9001981 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift @@ -5,3 +5,29 @@ // import Foundation + +func operateBank() { + let bank = Bank() + + while true { + print("1 : 은행 개점") + print("2 : 종료") + + if let choice = readLine(), let menu = Int(choice) { + switch menu { + case 1: + bank.open() + case 2: + print("프로그램을 종료합니다.") + return + default: + print("올바른 메뉴를 선택해주세요.") + } + } else { + print("숫자를 입력해주세요.") + } + } +} + + +operateBank() From 90c5eab80141b4c8856d0cd2dc53f7ed4f9c9a42 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Wed, 31 Jan 2024 17:29:39 +0900 Subject: [PATCH 06/33] . --- .../project.pbxproj | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj b/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj index 4e36feb4..56d00fea 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj +++ b/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj @@ -10,6 +10,10 @@ 1D9C82D72B6A2B1C0047245E /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9C82D62B6A2B1C0047245E /* Node.swift */; }; 1D9C82D92B6A2B270047245E /* LinkedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9C82D82B6A2B270047245E /* LinkedList.swift */; }; 1D9C82DB2B6A2B2F0047245E /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9C82DA2B6A2B2F0047245E /* Queue.swift */; }; + 847943632B6A2D3E00F85F0C /* Bank.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847943622B6A2D3E00F85F0C /* Bank.swift */; }; + 847943652B6A2D4800F85F0C /* Banker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847943642B6A2D4800F85F0C /* Banker.swift */; }; + 847943672B6A2D5300F85F0C /* Customer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847943662B6A2D5300F85F0C /* Customer.swift */; }; + 847943692B6A342200F85F0C /* Double+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847943682B6A342200F85F0C /* Double+.swift */; }; C7694E7A259C3EC00053667F /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7694E79259C3EC00053667F /* main.swift */; }; /* End PBXBuildFile section */ @@ -29,6 +33,10 @@ 1D9C82D62B6A2B1C0047245E /* Node.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Node.swift; sourceTree = ""; }; 1D9C82D82B6A2B270047245E /* LinkedList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkedList.swift; sourceTree = ""; }; 1D9C82DA2B6A2B2F0047245E /* Queue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = ""; }; + 847943622B6A2D3E00F85F0C /* Bank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bank.swift; sourceTree = ""; }; + 847943642B6A2D4800F85F0C /* Banker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Banker.swift; sourceTree = ""; }; + 847943662B6A2D5300F85F0C /* Customer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Customer.swift; sourceTree = ""; }; + 847943682B6A342200F85F0C /* Double+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+.swift"; sourceTree = ""; }; C7694E76259C3EC00053667F /* BankManagerConsoleApp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BankManagerConsoleApp; sourceTree = BUILT_PRODUCTS_DIR; }; C7694E79259C3EC00053667F /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -57,6 +65,9 @@ 1D9C82D52B6A2AF00047245E /* Bank */ = { isa = PBXGroup; children = ( + 847943622B6A2D3E00F85F0C /* Bank.swift */, + 847943642B6A2D4800F85F0C /* Banker.swift */, + 847943662B6A2D5300F85F0C /* Customer.swift */, ); path = Bank; sourceTree = ""; @@ -80,6 +91,7 @@ C7694E78259C3EC00053667F /* BankManagerConsoleApp */ = { isa = PBXGroup; children = ( + 847943682B6A342200F85F0C /* Double+.swift */, C7694E79259C3EC00053667F /* main.swift */, 1D9C82D42B6A2AD00047245E /* Queue */, 1D9C82D52B6A2AF00047245E /* Bank */, @@ -145,7 +157,11 @@ buildActionMask = 2147483647; files = ( 1D9C82D92B6A2B270047245E /* LinkedList.swift in Sources */, + 847943672B6A2D5300F85F0C /* Customer.swift in Sources */, + 847943692B6A342200F85F0C /* Double+.swift in Sources */, C7694E7A259C3EC00053667F /* main.swift in Sources */, + 847943652B6A2D4800F85F0C /* Banker.swift in Sources */, + 847943632B6A2D3E00F85F0C /* Bank.swift in Sources */, 1D9C82D72B6A2B1C0047245E /* Node.swift in Sources */, 1D9C82DB2B6A2B2F0047245E /* Queue.swift in Sources */, ); From beb38a941b3459ce6be909e49512a6ac5890bd44 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Wed, 31 Jan 2024 23:32:13 +0900 Subject: [PATCH 07/33] =?UTF-8?q?chore:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift | 3 ++- BankManagerConsoleApp/BankManagerConsoleApp/main.swift | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift index 0c966d8d..a005b31f 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift @@ -13,7 +13,7 @@ class Bank { func open() { print("은행 문이 열렸습니다.") - let numberOfCustomers = Int.random(in: 1...10) + let numberOfCustomers = Int.random(in: 10...30) print("고객 수: \(numberOfCustomers)") for customerNumber in 1...numberOfCustomers { @@ -35,3 +35,4 @@ class Bank { } } } + diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift index c9001981..cd2140f9 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift @@ -29,5 +29,4 @@ func operateBank() { } } - operateBank() From a1d75deb405a3b2e850c61b891d25620d7e78f62 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Thu, 1 Feb 2024 02:28:48 +0900 Subject: [PATCH 08/33] =?UTF-8?q?feat:=20refactor:=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=EC=A0=9C=EC=96=B4=EC=9E=90=EC=99=80=20final=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift | 4 ++-- .../BankManagerConsoleApp/Bank/Customer.swift | 2 +- .../BankManagerConsoleApp/Queue/LinkedList.swift | 2 +- BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift | 2 +- BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift index a005b31f..e7459960 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift @@ -7,7 +7,7 @@ import Foundation -class Bank { +final class Bank { let banker = Banker() var customerQueue = Queue() @@ -27,7 +27,7 @@ class Bank { banker.totalDuration = 0.0 } - func processCustomers() { + private func processCustomers() { while !customerQueue.isEmpty() { if let customer = customerQueue.dequeue() { banker.processCustomer(customer) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift index 3d12422b..a241b550 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift @@ -7,7 +7,7 @@ import Foundation -class Customer { +final class Customer { let number: Int init(number: Int) { diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift index 69ae76ef..897e309c 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift @@ -7,7 +7,7 @@ import Foundation -class LinkedList { +final class LinkedList { var front: Node? var rear: Node? diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift index 6539e582..6656897f 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift @@ -7,7 +7,7 @@ import Foundation -class Node { +final class Node { var value: T var next: Node? diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift index 11907dfe..75523604 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift @@ -7,8 +7,8 @@ import Foundation -class Queue { - var linkedList: LinkedList +final class Queue { + private var linkedList: LinkedList init(linkedList: LinkedList = LinkedList()) { self.linkedList = linkedList From 0666b40be28b9a8fc17c4cd250b21065537327d7 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Thu, 1 Feb 2024 02:33:19 +0900 Subject: [PATCH 09/33] =?UTF-8?q?feat:=20"=EC=9E=85=EB=A0=A5=20:=20"=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BankManagerConsoleApp/BankManagerConsoleApp/main.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift index cd2140f9..88b400cb 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift @@ -12,6 +12,7 @@ func operateBank() { while true { print("1 : 은행 개점") print("2 : 종료") + print("입력 : ",terminator: "") if let choice = readLine(), let menu = Int(choice) { switch menu { From ae792bce54c62b4fd324ddecc5e4d2b225211ae0 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Thu, 1 Feb 2024 02:35:02 +0900 Subject: [PATCH 10/33] =?UTF-8?q?refactor:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift index 230b3451..b39d0565 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift @@ -7,7 +7,7 @@ import Foundation -class Banker { +final class Banker { let duration = 0.7 var totalDuration = 0.0 func processCustomer(_ customer: Customer) { From 002d6e87f616f52747972c20605a584571bec196 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:11:55 +0900 Subject: [PATCH 11/33] =?UTF-8?q?feat:=20TaskType=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/TaskType.swift | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift new file mode 100644 index 00000000..79b1b6f1 --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift @@ -0,0 +1,35 @@ +// +// WorkType.swift +// BankManagerConsoleApp +// +// Created by dopamint on 2/1/24. +// + +import Foundation + +enum TaskType: CaseIterable, CustomStringConvertible { + case loan + case deposit +} + +extension TaskType { + + var description: String { + switch self { + case .loan: + return "대출" + case .deposit: + return "예금" + } + } + + var taskTime: Float { + switch self { + case .loan: + return 1.1 + case .deposit: + return 0.7 + } + } + +} From f40c08a65086b270e2a000c31d1b3a41adf6d823 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:13:19 +0900 Subject: [PATCH 12/33] =?UTF-8?q?refactor:=20Banker=20=EB=82=B4=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EC=86=8D=EC=84=B1?= =?UTF-8?q?=EB=93=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Bank.swift | 72 +++++++++++++++---- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift index e7459960..bf3b442c 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift @@ -8,29 +8,71 @@ import Foundation final class Bank { - let banker = Banker() - var customerQueue = Queue() - + + let depositBankerCount: Int + let loanBankerCount: Int + var totalDepositWorkingTime: Double = 0 + var totalLoanWorkingTime: Double = 0 + + var depositBankerQueue = Queue() + var loanBankerQueue = Queue() + var depositCustomerQueue = Queue() + var loanCustomerQueue = Queue() + + init(depositBankerCount: Int, loanBankerCount: Int) { + self.depositBankerCount = depositBankerCount + self.loanBankerCount = loanBankerCount + } + func open() { - print("은행 문이 열렸습니다.") + Messages.openBank.printMessage() let numberOfCustomers = Int.random(in: 10...30) print("고객 수: \(numberOfCustomers)") - for customerNumber in 1...numberOfCustomers { - let customer = Customer(number: customerNumber) - customerQueue.enqueue(customer) + + for _ in 1...depositBankerCount { + depositBankerQueue.enqueue(Banker(taskType: .deposit)) + } + for _ in 1...loanBankerCount { + loanBankerQueue.enqueue(Banker(taskType: .loan)) + } + + for number in 1...numberOfCustomers { + guard let customer = Customer(number: number) else { return } + if customer.taskType == .deposit { + depositCustomerQueue.enqueue(customer) + } else if customer.taskType == .loan { + loanCustomerQueue.enqueue(customer) + } } - processCustomers() - let totalDurationTimeFormatted = banker.totalDuration.formattedDecimal - print("업무가 마감되었습니다. 오늘 업무를 처리한 고객은 총 \(numberOfCustomers)명이며, 총 업무시간은 \(totalDurationTimeFormatted)초입니다.") - banker.totalDuration = 0.0 + + let formattedTotalWorkingTime = max(totalLoanWorkingTime, totalDepositWorkingTime).formattedDecimal + Messages.closeBank(customerCount: numberOfCustomers, totalTime: formattedTotalWorkingTime).printMessage() + } - + private func processCustomers() { - while !customerQueue.isEmpty() { - if let customer = customerQueue.dequeue() { - banker.processCustomer(customer) + while !depositCustomerQueue.isEmpty() || !loanCustomerQueue.isEmpty() { + + DispatchQueue.global().async { [self] in + if depositBankerQueue.isEmpty() == false { + + guard let banker = depositCustomerQueue.dequeue(), let workingTime = depositBankerQueue.dequeue()?.processCustomer(banker) + else { return } + totalDepositWorkingTime += workingTime + depositBankerQueue.enqueue(Banker(taskType: .deposit)) + } + } + + DispatchQueue.global().async { [self] in + if loanBankerQueue.isEmpty() == false { + + guard let banker = loanCustomerQueue.dequeue(), let workingTime = loanBankerQueue.dequeue()?.processCustomer(banker) + else { return } + loanBankerQueue.enqueue(Banker(taskType: .loan)) + totalLoanWorkingTime += workingTime + } } } } From ce8a675546b71009d5873a3384953a59174c4598 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:13:44 +0900 Subject: [PATCH 13/33] =?UTF-8?q?refactor:=20Banker=20=EB=82=B4=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EC=86=8D=EC=84=B1?= =?UTF-8?q?=EB=93=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Banker.swift | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift index b39d0565..71b0fba8 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift @@ -8,12 +8,18 @@ import Foundation final class Banker { - let duration = 0.7 - var totalDuration = 0.0 - func processCustomer(_ customer: Customer) { - print("\(customer.number)번 고객 업무 시작") + let taskType: TaskType + var duration: Double + + init(taskType: TaskType) { + self.taskType = taskType + self.duration = taskType.taskTime + } + + func processCustomer(_ customer: Customer) -> Double { + Messages.taskStart(number: customer.number, taskType: taskType.description).printMessage() Thread.sleep(forTimeInterval: duration) - print("\(customer.number)번 고객 업무 끝") - totalDuration += duration + Messages.taskDone(number: customer.number, taskType: taskType.description).printMessage() + return duration } } From 939cf90248aefbf1d8e9429f360725f6507e61a9 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:14:43 +0900 Subject: [PATCH 14/33] =?UTF-8?q?refactor:=20taskTime=20Float=20->=20Doubl?= =?UTF-8?q?e=20=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/TaskType.swift | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift index 79b1b6f1..6920d9d4 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift @@ -4,12 +4,10 @@ // // Created by dopamint on 2/1/24. // - -import Foundation - enum TaskType: CaseIterable, CustomStringConvertible { case loan case deposit + } extension TaskType { @@ -21,9 +19,10 @@ extension TaskType { case .deposit: return "예금" } + } - var taskTime: Float { + var taskTime: Double { switch self { case .loan: return 1.1 @@ -31,5 +30,5 @@ extension TaskType { return 0.7 } } - + } From fc55a4321895b59488f88be3c322e47f45e4c14b Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:15:14 +0900 Subject: [PATCH 15/33] =?UTF-8?q?refactor:=20Customer=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EC=8B=A4=ED=8C=A8=EA=B0=80=EB=8A=A5=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Customer.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift index a241b550..cb33f3f5 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift @@ -4,13 +4,15 @@ // // Created by dopamint on 1/31/24. // - -import Foundation - final class Customer { let number: Int + let taskType: TaskType - init(number: Int) { + init?(number: Int) { self.number = number + guard let randomTaskType = TaskType.allCases.randomElement() else { + return nil + } + self.taskType = randomTaskType } } From 7395e99acdb2e28acc10b2b44f0d7f1842a9d7a7 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:15:45 +0900 Subject: [PATCH 16/33] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20=EA=B0=9C?= =?UTF-8?q?=ED=96=89=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Queue/LinkedList.swift | 2 +- BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift | 2 +- BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift index 897e309c..d5664459 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift @@ -5,7 +5,7 @@ // Created by yujaehong on 1/31/24. // -import Foundation + final class LinkedList { var front: Node? diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift index 6656897f..fcf271e4 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift @@ -5,7 +5,7 @@ // Created by yujaehong on 1/31/24. // -import Foundation + final class Node { var value: T diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift index 75523604..b9e64df3 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift @@ -5,7 +5,7 @@ // Created by yujaehong on 1/31/24. // -import Foundation + final class Queue { private var linkedList: LinkedList @@ -20,6 +20,7 @@ extension Queue { linkedList.append(value) } + @discardableResult func dequeue() -> T? { return linkedList.removeFirst() } From c35f050991748e8521ff15c9235a2e94f25a879a Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:16:03 +0900 Subject: [PATCH 17/33] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift index f6e92199..b2a86574 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift @@ -5,8 +5,6 @@ // Created by dopamint on 1/31/24. // -import Foundation - extension Double { var formattedDecimal: String { return String(format: "%.2f", self) From 8d79b57979fff08142cffff17e29e65665de84e7 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:16:55 +0900 Subject: [PATCH 18/33] =?UTF-8?q?refactor:=20prtint=EB=AC=B8=20enum?= =?UTF-8?q?=EC=9D=84=20=ED=86=B5=ED=95=9C=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Messages.swift | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift new file mode 100644 index 00000000..d3b3fd97 --- /dev/null +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift @@ -0,0 +1,43 @@ +// +// Messages.swift +// BankManagerConsoleApp +// +// Created by dopamint on 2/1/24. +// + + + +enum Messages { + case menu + case exit + case openBank + case taskStart(number: Int, taskType: String) + case taskDone(number: Int, taskType: String) + case closeBank(customerCount: Int, totalTime: String) + case menuError + case numberError +} + +extension Messages { + func printMessage() { + switch self { + case .menu: + print("1 : 은행계정\n2 : 종료") + print("입력 : ", terminator: "") + case .exit: + print("프로그램을 종료합니다.") + case .openBank: + print("은행 문이 열렸습니다.") + case .taskStart(let number, let taskType): + print("\(number) 고객 \(taskType)업무 시작") + case .taskDone(let number, let taskType): + print("\(number) 고객 \(taskType)업무 종료") + case .closeBank(let customerCount, let totalTime): + print("업무가 마감되었습니다. 오늘 업무를 처리한 고객은 총 \(customerCount)명 이며, 총 업무시간은 \(totalTime)초 입니다.") + case .menuError: + print("올바른 메뉴를 선택해주세요.") + case .numberError: + print("숫자를 입력해주세요.") + } + } +} From 285991c40cac7633053881a2552d15656e9bda17 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:18:31 +0900 Subject: [PATCH 19/33] =?UTF-8?q?Revert=20"chore:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20import=20=EC=82=AD=EC=A0=9C"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit c35f050991748e8521ff15c9235a2e94f25a879a. --- BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift index b2a86574..f6e92199 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift @@ -5,6 +5,8 @@ // Created by dopamint on 1/31/24. // +import Foundation + extension Double { var formattedDecimal: String { return String(format: "%.2f", self) From 7a7117cda1ebd79a3fa26ef2d02a801e22a35841 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:21:13 +0900 Subject: [PATCH 20/33] =?UTF-8?q?feat:=20Messages=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift index d3b3fd97..4aa3c386 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Messages.swift @@ -5,8 +5,6 @@ // Created by dopamint on 2/1/24. // - - enum Messages { case menu case exit From 09e4440967e2c54376e422dfb546e232c017e87e Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Mon, 5 Feb 2024 11:21:43 +0900 Subject: [PATCH 21/33] =?UTF-8?q?refactor:=20print=EB=AC=B8=20enum?= =?UTF-8?q?=EC=9D=84=20=ED=86=B5=ED=95=9C=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 8 ++++++++ .../BankManagerConsoleApp/main.swift | 15 ++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj b/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj index 56d00fea..7f7d021e 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj +++ b/BankManagerConsoleApp/BankManagerConsoleApp.xcodeproj/project.pbxproj @@ -14,6 +14,8 @@ 847943652B6A2D4800F85F0C /* Banker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847943642B6A2D4800F85F0C /* Banker.swift */; }; 847943672B6A2D5300F85F0C /* Customer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847943662B6A2D5300F85F0C /* Customer.swift */; }; 847943692B6A342200F85F0C /* Double+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847943682B6A342200F85F0C /* Double+.swift */; }; + 849EDAD02B6BB1BA00096E84 /* Messages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849EDACF2B6BB1BA00096E84 /* Messages.swift */; }; + 849EDAD22B6BBB2500096E84 /* TaskType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849EDAD12B6BBB2500096E84 /* TaskType.swift */; }; C7694E7A259C3EC00053667F /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7694E79259C3EC00053667F /* main.swift */; }; /* End PBXBuildFile section */ @@ -37,6 +39,8 @@ 847943642B6A2D4800F85F0C /* Banker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Banker.swift; sourceTree = ""; }; 847943662B6A2D5300F85F0C /* Customer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Customer.swift; sourceTree = ""; }; 847943682B6A342200F85F0C /* Double+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+.swift"; sourceTree = ""; }; + 849EDACF2B6BB1BA00096E84 /* Messages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Messages.swift; sourceTree = ""; }; + 849EDAD12B6BBB2500096E84 /* TaskType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskType.swift; sourceTree = ""; }; C7694E76259C3EC00053667F /* BankManagerConsoleApp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BankManagerConsoleApp; sourceTree = BUILT_PRODUCTS_DIR; }; C7694E79259C3EC00053667F /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -65,6 +69,7 @@ 1D9C82D52B6A2AF00047245E /* Bank */ = { isa = PBXGroup; children = ( + 849EDAD12B6BBB2500096E84 /* TaskType.swift */, 847943622B6A2D3E00F85F0C /* Bank.swift */, 847943642B6A2D4800F85F0C /* Banker.swift */, 847943662B6A2D5300F85F0C /* Customer.swift */, @@ -91,6 +96,7 @@ C7694E78259C3EC00053667F /* BankManagerConsoleApp */ = { isa = PBXGroup; children = ( + 849EDACF2B6BB1BA00096E84 /* Messages.swift */, 847943682B6A342200F85F0C /* Double+.swift */, C7694E79259C3EC00053667F /* main.swift */, 1D9C82D42B6A2AD00047245E /* Queue */, @@ -157,6 +163,8 @@ buildActionMask = 2147483647; files = ( 1D9C82D92B6A2B270047245E /* LinkedList.swift in Sources */, + 849EDAD02B6BB1BA00096E84 /* Messages.swift in Sources */, + 849EDAD22B6BBB2500096E84 /* TaskType.swift in Sources */, 847943672B6A2D5300F85F0C /* Customer.swift in Sources */, 847943692B6A342200F85F0C /* Double+.swift in Sources */, C7694E7A259C3EC00053667F /* main.swift in Sources */, diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift index 88b400cb..00e72c2b 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift @@ -4,28 +4,25 @@ // Copyright © yagom academy. All rights reserved. // -import Foundation + func operateBank() { - let bank = Bank() + let bank = Bank(depositBankerCount: 1, loanBankerCount: 2) while true { - print("1 : 은행 개점") - print("2 : 종료") - print("입력 : ",terminator: "") - + Messages.menu.printMessage() if let choice = readLine(), let menu = Int(choice) { switch menu { case 1: bank.open() case 2: - print("프로그램을 종료합니다.") + Messages.exit.printMessage() return default: - print("올바른 메뉴를 선택해주세요.") + Messages.menuError.printMessage() } } else { - print("숫자를 입력해주세요.") + Messages.numberError.printMessage() } } } From 2e9d055a74d27bd309accfb19a871b9c0777362b Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Tue, 6 Feb 2024 17:51:05 +0900 Subject: [PATCH 22/33] =?UTF-8?q?chore:=20=EC=98=A4=ED=83=80=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Banker.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift index 71b0fba8..bcbd0e95 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift @@ -17,9 +17,9 @@ final class Banker { } func processCustomer(_ customer: Customer) -> Double { - Messages.taskStart(number: customer.number, taskType: taskType.description).printMessage() - Thread.sleep(forTimeInterval: duration) - Messages.taskDone(number: customer.number, taskType: taskType.description).printMessage() - return duration + Messages.taskStart(number: customer.number, taskType: taskType.description).printMessage() + Thread.sleep(forTimeInterval: duration) + Messages.taskDone(number: customer.number, taskType: taskType.description).printMessage() + return duration } } From f7a962456c183416b23685601bb25b27ffdfb735 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Tue, 6 Feb 2024 17:51:21 +0900 Subject: [PATCH 23/33] =?UTF-8?q?chore:=20=EA=B0=9C=ED=96=89=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift index 6920d9d4..06f7feb7 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift @@ -7,11 +7,9 @@ enum TaskType: CaseIterable, CustomStringConvertible { case loan case deposit - } extension TaskType { - var description: String { switch self { case .loan: From 6fea095b2d240f0cfc22c95d947c26bbf67f6e3a Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Tue, 6 Feb 2024 17:51:56 +0900 Subject: [PATCH 24/33] =?UTF-8?q?fix:=20removeFirst=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Queue/LinkedList.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift index d5664459..dd20f585 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift @@ -39,6 +39,12 @@ extension LinkedList { } func removeFirst() -> T? { + if front === rear { + let result = front + front = nil + rear = nil + return result?.value + } guard let currentFront = front else { return nil } front = front?.next return currentFront.value From 9d3ae26d39e58a15b7b7e92e91d64343c288fa20 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Tue, 6 Feb 2024 17:52:26 +0900 Subject: [PATCH 25/33] =?UTF-8?q?fix:=20=EC=9D=80=ED=96=89=EC=9B=90?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BankManagerConsoleApp/BankManagerConsoleApp/main.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift index 00e72c2b..c1260a53 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift @@ -7,7 +7,7 @@ func operateBank() { - let bank = Bank(depositBankerCount: 1, loanBankerCount: 2) + let bank = Bank(depositBankerCount: 2, loanBankerCount: 1) while true { Messages.menu.printMessage() From 7310cda937d2e937f32cb0130ab2ed3751730d02 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Tue, 6 Feb 2024 17:55:19 +0900 Subject: [PATCH 26/33] =?UTF-8?q?feat:=20processTask=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20serveCustomer=20=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Bank.swift | 32 ++++++------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift index bf3b442c..986cfa36 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift @@ -45,35 +45,21 @@ final class Bank { loanCustomerQueue.enqueue(customer) } } - processCustomers() - - let formattedTotalWorkingTime = max(totalLoanWorkingTime, totalDepositWorkingTime).formattedDecimal - Messages.closeBank(customerCount: numberOfCustomers, totalTime: formattedTotalWorkingTime).printMessage() - } - private func processCustomers() { - while !depositCustomerQueue.isEmpty() || !loanCustomerQueue.isEmpty() { - - DispatchQueue.global().async { [self] in - if depositBankerQueue.isEmpty() == false { - - guard let banker = depositCustomerQueue.dequeue(), let workingTime = depositBankerQueue.dequeue()?.processCustomer(banker) - else { return } - totalDepositWorkingTime += workingTime - depositBankerQueue.enqueue(Banker(taskType: .deposit)) + private func processTask(banker: Banker, customer: Customer, bankerQueue: Queue) { + DispatchQueue.global().async(group: group) { [self] in + totalDepositWorkingTime += banker.processCustomer(customer) + bankerQueue.enqueue(Banker(taskType: banker.taskType)) } } - DispatchQueue.global().async { [self] in - if loanBankerQueue.isEmpty() == false { - - guard let banker = loanCustomerQueue.dequeue(), let workingTime = loanBankerQueue.dequeue()?.processCustomer(banker) + private func serveCustomer(bankerQueue: Queue, customerQueue: Queue) { + if bankerQueue.isEmpty() == false { + guard let customer = customerQueue.dequeue(), + let banker = bankerQueue.dequeue() else { return } - loanBankerQueue.enqueue(Banker(taskType: .loan)) - totalLoanWorkingTime += workingTime - } - } + processTask(banker: banker, customer: customer, bankerQueue: bankerQueue) } } } From a14c168763a576bae1f273abb60e77be80b2dc87 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Tue, 6 Feb 2024 18:41:53 +0900 Subject: [PATCH 27/33] =?UTF-8?q?refactor:=20=EC=A0=91=EA=B7=BC=EC=A0=9C?= =?UTF-8?q?=EC=96=B4=EC=9E=90=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Bank.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift index 986cfa36..32490440 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift @@ -8,16 +8,16 @@ import Foundation final class Bank { + private let depositBankerCount: Int + private let loanBankerCount: Int + private var totalDepositWorkingTime: Double + private var totalLoanWorkingTime: Double - let depositBankerCount: Int - let loanBankerCount: Int - var totalDepositWorkingTime: Double = 0 - var totalLoanWorkingTime: Double = 0 - - var depositBankerQueue = Queue() - var loanBankerQueue = Queue() - var depositCustomerQueue = Queue() - var loanCustomerQueue = Queue() + private var depositBankerQueue = Queue() + private var loanBankerQueue = Queue() + private var depositCustomerQueue = Queue() + private var loanCustomerQueue = Queue() + private let group = DispatchGroup() init(depositBankerCount: Int, loanBankerCount: Int) { self.depositBankerCount = depositBankerCount From d4a1283dae9b95098a457db866e79ae238844bb9 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Tue, 6 Feb 2024 18:46:02 +0900 Subject: [PATCH 28/33] =?UTF-8?q?refactor:=20=EC=9B=90=ED=99=9C=ED=95=9C?= =?UTF-8?q?=20=EB=B9=84=EB=8F=99=EA=B8=B0=20=EC=9E=91=EC=97=85=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20dispatchgroup=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Bank.swift | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift index 32490440..b87b140d 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift @@ -22,6 +22,8 @@ final class Bank { init(depositBankerCount: Int, loanBankerCount: Int) { self.depositBankerCount = depositBankerCount self.loanBankerCount = loanBankerCount + self.totalDepositWorkingTime = 0.0 + self.totalLoanWorkingTime = 0.0 } func open() { @@ -29,15 +31,32 @@ final class Bank { let numberOfCustomers = Int.random(in: 10...30) print("고객 수: \(numberOfCustomers)") + setUpBankerQueue(depositBankerCount: depositBankerCount, loanBankerCount: loanBankerCount) + setUpCustomerQueue(count: numberOfCustomers) + while !depositCustomerQueue.isEmpty() || !loanCustomerQueue.isEmpty() { + serveCustomer(bankerQueue: depositBankerQueue, customerQueue: depositCustomerQueue) + serveCustomer(bankerQueue: loanBankerQueue, customerQueue: loanCustomerQueue) + } + group.wait() + + let formattedTotalWorkingTime = max(totalLoanWorkingTime, totalDepositWorkingTime).formattedDecimal + Messages.closeBank(customerCount: numberOfCustomers, totalTime: formattedTotalWorkingTime).printMessage() + depositBankerQueue.clear() + loanBankerQueue.clear() + } + + private func setUpBankerQueue(depositBankerCount: Int, loanBankerCount: Int) { for _ in 1...depositBankerCount { depositBankerQueue.enqueue(Banker(taskType: .deposit)) } for _ in 1...loanBankerCount { loanBankerQueue.enqueue(Banker(taskType: .loan)) } - - for number in 1...numberOfCustomers { + } + + private func setUpCustomerQueue(count: Int) { + for number in 1...count { guard let customer = Customer(number: number) else { return } if customer.taskType == .deposit { depositCustomerQueue.enqueue(customer) @@ -51,16 +70,18 @@ final class Bank { DispatchQueue.global().async(group: group) { [self] in totalDepositWorkingTime += banker.processCustomer(customer) bankerQueue.enqueue(Banker(taskType: banker.taskType)) - } - } - + } + } + private func serveCustomer(bankerQueue: Queue, customerQueue: Queue) { if bankerQueue.isEmpty() == false { guard let customer = customerQueue.dequeue(), let banker = bankerQueue.dequeue() - else { return } + else { return } processTask(banker: banker, customer: customer, bankerQueue: bankerQueue) } } } + + From 2bef8df5b730309c54e8c1d760938dee0a0457bf Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Sat, 10 Feb 2024 15:16:29 +0900 Subject: [PATCH 29/33] =?UTF-8?q?refactor:=20Banker=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EA=B0=84=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Banker.swift | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift index bcbd0e95..72e7afcf 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Banker.swift @@ -8,18 +8,10 @@ import Foundation final class Banker { - let taskType: TaskType - var duration: Double - - init(taskType: TaskType) { - self.taskType = taskType - self.duration = taskType.taskTime - } - - func processCustomer(_ customer: Customer) -> Double { - Messages.taskStart(number: customer.number, taskType: taskType.description).printMessage() - Thread.sleep(forTimeInterval: duration) - Messages.taskDone(number: customer.number, taskType: taskType.description).printMessage() - return duration + + func processCustomer(_ customer: Customer) { + Messages.taskStart(number: customer.number, taskType: customer.taskType.description).printMessage() + Thread.sleep(forTimeInterval: customer.taskType.taskTime) + Messages.taskDone(number: customer.number, taskType: customer.taskType.description).printMessage() } } From 0953ff9ee37965c14d08f6c77d53c74d7ebd412b Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Sat, 10 Feb 2024 15:18:27 +0900 Subject: [PATCH 30/33] =?UTF-8?q?refator:=20TakeType=EC=9D=98=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EC=B1=84=ED=83=9D=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=86=A0=EC=BD=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CaseIterable, CustomStringConvertible 삭제 --- .../BankManagerConsoleApp/Bank/TaskType.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift index 06f7feb7..b0ae593b 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/TaskType.swift @@ -4,7 +4,7 @@ // // Created by dopamint on 2/1/24. // -enum TaskType: CaseIterable, CustomStringConvertible { +enum TaskType { case loan case deposit } @@ -17,7 +17,6 @@ extension TaskType { case .deposit: return "예금" } - } var taskTime: Double { @@ -28,5 +27,8 @@ extension TaskType { return 0.7 } } - + + static func random() -> TaskType { + return Bool.random() ? .loan : .deposit + } } From c013f5f3d7bfaf59623bc8cca66e6b2b4f5db553 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Sat, 10 Feb 2024 15:19:46 +0900 Subject: [PATCH 31/33] =?UTF-8?q?chore:=20=EA=B0=9C=ED=96=89=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20@discardableResult=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Queue/LinkedList.swift | 2 -- BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift | 3 --- BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift | 4 +--- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift index dd20f585..a72bd778 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/LinkedList.swift @@ -5,8 +5,6 @@ // Created by yujaehong on 1/31/24. // - - final class LinkedList { var front: Node? var rear: Node? diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift index fcf271e4..3beb0840 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Node.swift @@ -4,9 +4,6 @@ // // Created by yujaehong on 1/31/24. // - - - final class Node { var value: T var next: Node? diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift index b9e64df3..223ac562 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Queue/Queue.swift @@ -5,8 +5,6 @@ // Created by yujaehong on 1/31/24. // - - final class Queue { private var linkedList: LinkedList @@ -20,7 +18,7 @@ extension Queue { linkedList.append(value) } - @discardableResult + func dequeue() -> T? { return linkedList.removeFirst() } From b53e24f174f97031ea0f1263d35cdda4c01f69e4 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Sat, 10 Feb 2024 15:21:33 +0900 Subject: [PATCH 32/33] =?UTF-8?q?refactor:=20taskType=20=EC=A7=80=EC=A0=95?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20initializer=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Customer.swift | 8 +++----- BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift | 2 -- BankManagerConsoleApp/BankManagerConsoleApp/main.swift | 7 +++---- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift index cb33f3f5..070f8330 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Customer.swift @@ -8,11 +8,9 @@ final class Customer { let number: Int let taskType: TaskType - init?(number: Int) { + init(number: Int) { self.number = number - guard let randomTaskType = TaskType.allCases.randomElement() else { - return nil - } - self.taskType = randomTaskType + self.taskType = TaskType.random() } } + diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift index f6e92199..b2a86574 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Double+.swift @@ -5,8 +5,6 @@ // Created by dopamint on 1/31/24. // -import Foundation - extension Double { var formattedDecimal: String { return String(format: "%.2f", self) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift index c1260a53..55c976d1 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/main.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/main.swift @@ -2,16 +2,15 @@ // BankManagerConsoleApp - main.swift // Created by yagom. // Copyright © yagom academy. All rights reserved. -// - - +// func operateBank() { let bank = Bank(depositBankerCount: 2, loanBankerCount: 1) while true { Messages.menu.printMessage() - if let choice = readLine(), let menu = Int(choice) { + if let choice = readLine(), + let menu = Int(choice) { switch menu { case 1: bank.open() From 3814d579386d52ef503207f5f707b332638176b6 Mon Sep 17 00:00:00 2001 From: yoruck2 Date: Sat, 10 Feb 2024 15:22:54 +0900 Subject: [PATCH 33/33] =?UTF-8?q?refactor:=204=EA=B0=9C=EC=9D=98=20?= =?UTF-8?q?=ED=81=90=20->=201=EA=B0=9C=EC=9D=98=20=EC=86=90=EB=8B=98?= =?UTF-8?q?=ED=81=90=20,=20DispatchSemaphore=20=ED=99=9C=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BankManagerConsoleApp/Bank/Bank.swift | 77 +++++++------------ 1 file changed, 26 insertions(+), 51 deletions(-) diff --git a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift index b87b140d..f704e5f4 100644 --- a/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift +++ b/BankManagerConsoleApp/BankManagerConsoleApp/Bank/Bank.swift @@ -8,77 +8,52 @@ import Foundation final class Bank { - private let depositBankerCount: Int - private let loanBankerCount: Int - private var totalDepositWorkingTime: Double - private var totalLoanWorkingTime: Double - - private var depositBankerQueue = Queue() - private var loanBankerQueue = Queue() - private var depositCustomerQueue = Queue() - private var loanCustomerQueue = Queue() + + private var banker = Banker() + private var customerQueue = Queue() + private let depositSemaphore: DispatchSemaphore + private let loanSemaphore: DispatchSemaphore private let group = DispatchGroup() init(depositBankerCount: Int, loanBankerCount: Int) { - self.depositBankerCount = depositBankerCount - self.loanBankerCount = loanBankerCount - self.totalDepositWorkingTime = 0.0 - self.totalLoanWorkingTime = 0.0 + self.depositSemaphore = DispatchSemaphore(value: depositBankerCount) + self.loanSemaphore = DispatchSemaphore(value: loanBankerCount) } func open() { + let startTime = Date() Messages.openBank.printMessage() let numberOfCustomers = Int.random(in: 10...30) - + print("고객 수: \(numberOfCustomers)") - setUpBankerQueue(depositBankerCount: depositBankerCount, loanBankerCount: loanBankerCount) setUpCustomerQueue(count: numberOfCustomers) - while !depositCustomerQueue.isEmpty() || !loanCustomerQueue.isEmpty() { - serveCustomer(bankerQueue: depositBankerQueue, customerQueue: depositCustomerQueue) - serveCustomer(bankerQueue: loanBankerQueue, customerQueue: loanCustomerQueue) + while let customer = customerQueue.dequeue() { + switch customer.taskType { + case .deposit: + serveCustomer(semaphore: depositSemaphore, customer: customer) + case .loan: + serveCustomer(semaphore: loanSemaphore, customer: customer) + } } group.wait() - - let formattedTotalWorkingTime = max(totalLoanWorkingTime, totalDepositWorkingTime).formattedDecimal - Messages.closeBank(customerCount: numberOfCustomers, totalTime: formattedTotalWorkingTime).printMessage() - depositBankerQueue.clear() - loanBankerQueue.clear() + let endTime = Date() + let elapsedTime = endTime.timeIntervalSince(startTime).formattedDecimal + Messages.closeBank(customerCount: numberOfCustomers, totalTime: elapsedTime).printMessage() } - private func setUpBankerQueue(depositBankerCount: Int, loanBankerCount: Int) { - for _ in 1...depositBankerCount { - depositBankerQueue.enqueue(Banker(taskType: .deposit)) - } - for _ in 1...loanBankerCount { - loanBankerQueue.enqueue(Banker(taskType: .loan)) + private func serveCustomer(semaphore: DispatchSemaphore, customer: Customer) { + DispatchQueue.global().async(group: group) { + semaphore.wait() + self.banker.processCustomer(customer) + semaphore.signal() } } private func setUpCustomerQueue(count: Int) { for number in 1...count { - guard let customer = Customer(number: number) else { return } - if customer.taskType == .deposit { - depositCustomerQueue.enqueue(customer) - } else if customer.taskType == .loan { - loanCustomerQueue.enqueue(customer) - } - } - } - - private func processTask(banker: Banker, customer: Customer, bankerQueue: Queue) { - DispatchQueue.global().async(group: group) { [self] in - totalDepositWorkingTime += banker.processCustomer(customer) - bankerQueue.enqueue(Banker(taskType: banker.taskType)) - } - } - - private func serveCustomer(bankerQueue: Queue, customerQueue: Queue) { - if bankerQueue.isEmpty() == false { - guard let customer = customerQueue.dequeue(), - let banker = bankerQueue.dequeue() - else { return } - processTask(banker: banker, customer: customer, bankerQueue: bankerQueue) + let customer = Customer(number: number) + customerQueue.enqueue(customer) } } }