Algorithm/Swift

[Programmers] 오픈채팅방 (Swift)

Minny27 2021. 7. 13. 20:33

문제 : 

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

 

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

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

programmers.co.kr

 

1. 문제 이해하기

  • 문자열 배열 형태로 각 문자열의 첫 번째 단어는 입장, 퇴장, 변경, 두 번째는 유저 아이디, 세 번째는 닉네임이 저장되어 있습니다.
  • 모든 record를 수행하고 나서, 변경이 있다면 변경된 닉네임을 기준으로, 최종적으로 오픈 채팅방에 출력되는 문자열 배열 출력
  • record는 1 이상 100,000 이하
  • 입출력 예시를 보면 확실히 문제를 이해할 수 있습니다.

 

2. 문제 풀이 생각하기

  1. 입력이 최대 100,000가 주어질 수 있으므로 100,000의 제곱만큼의 시간이 걸리면 안 될 것이라는 생각을 했습니다.
  2. 그래서 무조건 해시 자료구조를 사용해야겠다고 생각했습니다. -> [유저 아이디 : 닉네임]
  3. 그리고 모든 record를 한 번 확인하면서 유저의 닉네임을 갱신하고, 갱신된 닉네임으로 다시 한 번 record를 확인하면서 출력 값을 저장해야겠다고 생각했습니다.
  4. 처음 record를 확인할 때는 Enter와 Change일 때 해당 유저 아이디에 해당하는 닉네임을 갱신하고, 그 이외의 경우는 넘어갑니다.
  5. 두 번째로 record를 확인할 때는 갱신된 닉네임을 기준으로 Enter 일 때는 입장, Leave일 때는 퇴장 문자열을 ans에 저장합니다.

 

3. 차근차근 구현하기

import Foundation

func solution(_ record:[String]) -> [String] {
    var ans = [String]()
    var ht = [String : String]() // [유저 아이디 : 닉네임]
    
    for str in record {
        let line = str.split(separator: " ").map{String($0)}
        // Enter, Change 일 때만 닉네임을 갱신하므로 그 외의 경우는 넘어가기
        if line[0] != "Enter" && line[0] != "Change" {
            continue
        }
        ht[line[1]] = line[2] // 닉네임 갱신
    }

    for str in record {
        let line = str.split(separator: " ").map{String($0)}
        if line[0] == "Enter" {
            ans.append("\(ht[line[1]]!)님이 들어왔습니다.")
            continue
        }
        if line[0] == "Leave" {
            ans.append("\(ht[line[1]]!)님이 나갔습니다.")
            continue
        }
    }
    return ans
}

 

4. 피드백

  • Swift의 문자열 처리는 역시 Python보다 더 어려운 것 같습니다. 숙련도를 더 올려보도록 하겠습니다.