알고리즘/알고리즘 문제풀이
카카오 기출_프로그래머스_오픈채팅방
Downey
2021. 9. 14. 17:08
https://programmers.co.kr/learn/courses/30/lessons/42888
접근 방법
- record를 분리해서 id: nickName으로 변환
- record 순서대로 메세지 반환
정답코드
더보기
import Foundation
func solution(_ record:[String]) -> [String] {
var idNickNamePair: [String:String] = [:]
var queue: [String] = []
var sol: [String] = []
for info in record {
let separated = info.components(separatedBy: " ")
if idNickNamePair[separated[1]] == nil {
idNickNamePair[separated[1]] = ""
}
switch (separated[0]) {
case "Enter" :
idNickNamePair[separated[1]] = separated[2]
queue.append("Enter \(separated[1])")
break
case "Leave" :
queue.append("Leave \(separated[1])")
break
case "Change" :
idNickNamePair[separated[1]] = separated[2]
break
default:
break
}
}
for que in queue {
let str = que.components(separatedBy: " ")
if str[0] == "Enter" {
sol.append("\(idNickNamePair[str[1]]!)님이 들어왔습니다.")
} else {
sol.append("\(idNickNamePair[str[1]]!)님이 나갔습니다.")
}
}
return sol
}
개선 코드
풀면서, 아쉬웠던 점이 있었는데, 고수의 코드를 슬쩍 보고 개선을 진행
코드가 짧아지긴했는데, 로직의 변경이 없어서 성능의 개선은 없었다.
장점으로는,
- idNickNamePair의 저장 방식을 깔끔하게 변경한 것,
- action을 지정함으로 실수를 줄일 수 있고, 구현에 있어서 하드코딩이 줄어든 것.
더보기
import Foundation
func solution(_ record:[String]) -> [String] {
var idNickNamePair: [String:String] = [:]
let action = ["Enter":"님이 들어왔습니다.", "Leave":"님이 나갔습니다."]
for info in record {
let separated = info.components(separatedBy: " ")
if idNickNamePair[separated[1]] == nil {
idNickNamePair[separated[1]] = ""
}
if separated[0] == "Leave" {
continue
} else {
idNickNamePair[separated[1]] = separated[2]
}
}
return record.filter({!$0.contains("Change")})
.map {
let strArr = $0.components(separatedBy: " ")
return idNickNamePair[strArr[1]]! + action[strArr[0]]!
}
}