Skip to content

오픈채팅방 #42888 #3

@chaentopia

Description

@chaentopia

🙋🏼 문제

오픈채팅방

💡 풀이

쉬워보이는데 생각보다 품이 많이 든 문제!
record의 값을 전부 확인한 후 (id 체크), 출력을 위해서 다시 id와 leave / enter 체크를 해줘야 한다.
물론 실제라면 UI에서 일부만 확인해서 바꿔줘야겠지만.. (어케함!)

let enter = "님이 들어왔습니다."
let leave = "님이 나갔습니다."
var member = [String : String]()
var arr: [[String]] = []
var result: [String] = []

enter, leave 시의 텍스트를 따로 저장해주었고, member dictionary에는 id와 닉네임을 저장할 수 있도록 했다.
arr는 두번째 단계에서 id와 leave / enter 확인해줄 때 사용해주기 위함이고, result는 결과 array

record.forEach {
let text = $0.components(separatedBy: " ")
switch text[0] {
case "Enter":
arr.append([text[1], enter])
member[text[1]] = text[2]
case "Leave":
arr.append([text[1], leave])
case "Change":
member[text[1]] = text[2]
default:
return
}
}

record의 문장을 하나씩 보며 space를 기준으로 나눠주었다.
Enter / Leave / Change로 나뉘게 되는 text[0]을 switch - case 문으로 나눴다.

  • Enter 시, id에 해당하는 text[1]와 닉네임에 해당하는 text[2]를 member dictionary에 넣었다.
    그리고 id와 enter 텍스트를 arr에 추가했다.
    (생각해 보니까 굳이 enter 텍스트를 여기서 넣었어야 하나 싶다.. 걍 result 단계에서 넣어줄걸..)
  • Leave 시, id와 leave 텍스트를 arr에 추가했다. member를 건들지 않은 것은 여기서는 id가 바뀌지 않고, 앞선 Enter가 없다면 Leave가 발생할 수 없는데 Enter에서 이미 member를 건드리기 때문!
  • Change 시, result에 출력되는 것이 없기 때문에 arr에 추가할 필요는 없고, 이름이 바뀌었을 때 member의 id를 확인해서 바꿔줘야 하기 때문에 member id에 이름을 교체해주었다.

arr.forEach {
if let name = member[$0[0]] {
result.append(name + $0[1])
} else {
return
}
}

arr를 forEach로 확인해 주면서, result에 해당 id에 해당하는 이름과 enter / leave 텍스트를 추가해주었다.

그리고 마지막에 return result로 답 반환

처음 채점 때 if let 문 안 써서 테스트 케이스 하나가 날라감..
상여자식 코드 (강제 언래핑) 쓰려다가 말았다 ㅋㅋ;;

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions