공대생의 비망록

[프로그래머스][Lv. 2] 오픈채팅방 Swift 풀이 본문

Programming Language/Swift

[프로그래머스][Lv. 2] 오픈채팅방 Swift 풀이

myungsup1250 2022. 4. 9. 00:58

https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

풀이

 

2019 KAKAO BLIND RECRUITMENT 코딩테스트에 나온 문제.

 

Change, Enter, Leave 라는 3가지 이벤트를 처리하는 간단한 구현 문제이다.

 

먼저, Enter와 Leave의 경우에 "~님이 들어왔습니다." 그리고 "~님이 나갔습니다." 만 logs 문자열 배열에 저장하고, idLogs라는 문자열 배열에 아이디를 추가해둔다.

* logs와 idLogs는 같은 순서, 같은 크기로 저장한다. 나중에 그대로 붙여서 결과로 내보낼 예정이다.

그리고 사용자 아이디와 닉네임은 따로 관리한다.

추후에 Change로 바뀔 가능성이 있으므로 id:nickname 형태로 userName 딕셔너리를 사용하여 저장한다.

 

그리고 Change 일 경우에는 이미 사용자에 대한 정보가 있으므로 userName 딕셔너리에 저장된 값을 update만 해준다.

 

모든 record를 다 순회하였으면 마지막에 for loop를 활용하여

logs[i] = userName[idLogs[i]]! + logs[i] 형태로 닉네임을 logs 문자열 배열에 저장하여 간단하게 끝낸다.

 

끝!

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
import Foundation
 
func solution(_ record:[String]) -> [String] {
    var logs: [String= [String]()
    var idLogs: [String= [String]()
    var userName: [String:String= [String:String]()
    for rcd in record {
        let slice: [String= rcd.split(separator: " ").map { String($0) }
        if slice[0== "Change" {
            userName.updateValue(slice[2], forKey: slice[1])
        } else {
            idLogs.append(slice[1])
            if slice[0== "Enter" {
                userName.updateValue(slice[2], forKey: slice[1])
                logs.append("님이 들어왔습니다.")        
            } else if slice[0== "Leave" {
                logs.append("님이 나갔습니다.")
            } 
        }
    }
    for i in 0..<idLogs.count {
        logs[i] = userName[idLogs[i]]! + logs[i]
    }
    return logs
}
cs
Comments