Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- MainScheduler.Instance
- 프로그래머스
- 오픈채팅방
- 등굣길
- IOS
- data_structure
- 청년취업사관학교
- combine
- Realm
- swift
- gitflow
- DynamicMemberLookup
- DispatchQueue
- RaceCondition
- DiffableDataSource
- rxswift
- leetcode
- SwiftUI
- DependencyInjection
- GIT
- 코테
- cleanarchitecture
- MainScheduler.asyncInstance
- 명품cppProgramming c++
- MainScheduler
- SeSAC
- GCD
- MethodSwilzzling
- CoreBluetooth
- SRP
Archives
- Today
- Total
Do.
2019 KAKAO BLIND RECRUITMENT - 오픈 채팅방, Swift 본문
https://programmers.co.kr/learn/courses/30/lessons/42888
1. 핵심은 출입로그 메시지에서 이름이 변경된 유저의 로그 내용을 변경해야 한다는 뜻이다. 일일이 서치해서 지우기에는 입력 받는데 O(N), 출력문으로 컨버팅 하는데 O(N) 으로 O(N^2)이므로 여유가 없다. 따라서 User를 클래스로 정의하고, 참조를 통해 해결해 볼 수 있다.
2. User는 id로 구분 가능한 Hashable 객체이다.
3. Chat 클래스는 Log 형태로 User를 소유하고 있고, Enter, Leave, Change 명령어를 수행할 때 이름을 참조해서 바꾸기 때문에, 별도의 시간 소모 없이 수행이 가능하다.
import Foundation
final class User: Equatable, Hashable {
let id: String
var name: String
init(id: String, name: String) {
self.id = id
self.name = name
}
static func == (lhs: User, rhs: User) -> Bool {
lhs === rhs
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
final class Chat {
enum Log: CustomStringConvertible {
case enter(User)
case leave(User)
private func messageFormatter(log: Log) -> String {
switch log {
case .enter(let user):
return "\(user.name)님이 들어왔습니다."
case .leave(let user):
return "\(user.name)님이 나갔습니다."
}
}
var description: String {
messageFormatter(log: self)
}
}
private var log: [Log] = []
private var userList: [String: User] = [:]
var message: [String] {
log.map{$0.description}
}
func enter(user: User) {
if let alreadyUser = userList[user.id] {
log.append(.enter(alreadyUser))
alreadyUser.name = user.name
} else {
log.append(.enter(user))
userList.updateValue(user, forKey: user.id)
}
}
func leave(userId: String) {
guard let user = userList[userId] else { return}
log.append(.leave(user))
}
func change(userId: String, changeName: String) {
guard let target = userList[userId] else { return }
target.name = changeName
}
}
func solution(_ record:[String]) -> [String] {
let chat = Chat()
record.forEach { packet in
let command = packet.components(separatedBy: " ")
switch command[0] {
case "Enter":
let user = User(id: command[1], name: command[2])
chat.enter(user: user)
case "Leave":
chat.leave(userId: command[1])
case "Change":
chat.change(userId: command[1], changeName: command[2])
default:
return
}
}
return chat.message
}
'Algorithm' 카테고리의 다른 글
2022 KAKAO BLIND RECRUITMENT - k진수에서 소수 개수 구하기, Swift (0) | 2022.03.15 |
---|---|
2022 KAKAO BLIND RECRUITMENT - 주차요금 계산하기, Swift (0) | 2022.03.14 |
2020 KAKAO BLIND RECRUITMET - 문자열 압축, Swift (0) | 2022.03.12 |
최대공약수와 최소공배수 (0) | 2022.02.09 |
Ring Buffer를 이용한 Queue 자료구조 구현, Swift (0) | 2022.02.09 |
Comments