반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - 오픈채팅방" 문제를 풀었습니다.
Github
문제 링크
풀이
이번 문제는 해시를 이용한 문제입니다.
Swift에서는 디렉토리가 있기 때문에 편리하게 구현할 수 있었습니다.
이 문제의 핵심은 닉네임과 액션을 매칭하는 게 아니라 uid와 액션을 매칭해야 한다는 점입니다.
저는 닉네임과 액션을 나눠서 처리했습니다.
"Enter uid1234 Muzi"가 들어오면 names 디렉토리에는 uid와 닉네임을 넣어줬고 records에는 "Enter"와 uid를 넣어줬습니다.
Enter 액션은 names 디렉토리에 키 값이 있다면 업데이트 해주고 처음 들어오는 uid라면 값을 넣어줍니다. records에도 uid와 "Enter"를 튜플로 넣어 줍니다.
Leave 액션은 names와 연관이 없으므로 records에만 append 해주면 됩니다.
Change는 names 디렉토리의 값만 업데이트 해주면 됩니다.
모든 record 처리가 완료 되었으면 records 튜플 배열을 토대로 출력해줍니다.
이 때 action은 미리 디렉토리로 선언해주었는데요.
Enter는 "님이 들어왔습니다."로, Leave는 "님이 나갔습니다."로 매칭 시켰습니다.
이렇게 디렉토리를 이용하면 쉽게 해시 문제를 해결할 수 있습니다.
전체 코드
import Foundation
func solution(_ record:[String]) -> [String] {
var results: [String] = []
let actions: [String: String] = ["Enter": "님이 들어왔습니다.", "Leave": "님이 나갔습니다."]
var records: [(action: String, uid: String)] = []
var names: [String: String] = [:]
for record in record {
let input = record.split { $0 == " " }.map { String($0) }
if input[0] != "Change" {
records.append((input[0], input[1]))
}
if input.count == 3 {
names.updateValue(input[2], forKey: input[1])
}
}
for record in records {
results.append("\(names[record.uid] ?? "")\(actions[record.action] ?? "")")
}
return results
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형