728x90
반응형
programmers.co.kr/learn/courses/30/lessons/42888?language=swift
오픈채팅방에서 입장/퇴장한 이름을 최종 이름으로 변경해주면 되는 문제
A가 들어왔습니다
B가 들어왔습니다
A가 나갔습니다.
C가 들어왔습니다. (나갔던 A)
이 경우 위처럼이 아닌
C가 들어왔습니다
B가 들어왔습니다
C가 나갔습니다.
C가 들어왔습니다.
처럼 보여져야한다. 또한 기존의 A,B가 닉네임을 중복으로 바꿔도 고유의 ID가 존재하기 때문에 서로 다른 값으로 인식해줘야 한다.
우선 최종단의 이름을 구하고 userID에 맞게 닉네임을 변경해주고 입장/퇴장 문구 또한 변경해주면 된다.
바로 코드로 가보자!
import Foundation
func solution(_ record:[String]) -> [String] {
// [ID : 이름] 쌍
var userID = [String:String]()
// ["상태","ID","이름"]으로 나누기 (퇴장의 경우 "이름" 없음)
let record = record.map {$0.components(separatedBy: " ")}
var result = [String]()
// 딕셔너리 키 초기화
for id in record.map {$0[1]} {
if !userID.keys.contains(id) {
userID[id] = ""
}
}
// 최종 이름을 입력
for rec in record {
if rec[0] != "Leave" {
userID[rec[1]] = rec[2]
}
}
// ID에 맞게 이름 변경 및 상태 메시지 출력
for rec in record {
if let name = userID[rec[1]] {
switch rec[0] {
case "Enter":
result.append("\(name)님이 들어왔습니다.")
case "Leave":
result.append("\(name)님이 나갔습니다.")
default:
break
}
}
}
return result
}
[ 프로세스 ]
1. [ID:이름]의 딕셔너리를 생성하고 초기화 해준다. (키 값 세팅)
2. ID를 기준으로 하여 입/퇴장 메시지를 가장 마지막으로 변경한 이름으로 바꿔준다.
3. 반환
2단계가 맞나...? 싶은 문제. 조금 더 효율적으로 풀 수 있을 것 같긴하다. 간단하게 상태 값을 업데이트 해주고, 실 반영해주는 문제이기에 어렵지 않았다. 실제로 서비스에 쓰일만한 기능이다보니 재밌게 풀었던 것 같다.
728x90
반응형