👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

[프로그래머스] 오픈채팅방

728x90
반응형

programmers.co.kr/learn/courses/30/lessons/42888?language=swift

 

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

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

programmers.co.kr

오픈채팅방에서 입장/퇴장한 이름을 최종 이름으로 변경해주면 되는 문제

 

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
반응형