알고리즘/알고리즘 문제풀이

카카오 기출_프로그래머스_오픈채팅방

Downey 2021. 9. 14. 17:08

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

접근 방법

  1. record를 분리해서 id: nickName으로 변환
  2. record 순서대로 메세지 반환

정답코드

 

더보기
import Foundation

func solution(_ record:[String]) -> [String] {
    var idNickNamePair: [String:String] = [:]
    var queue: [String] = []
    var sol: [String] = []
    
    for info in record {
        let separated = info.components(separatedBy: " ")
        
        if idNickNamePair[separated[1]] == nil {
            idNickNamePair[separated[1]] = ""
        }
        
        switch (separated[0]) {
            case "Enter" :
            idNickNamePair[separated[1]] = separated[2]
            queue.append("Enter \(separated[1])")
            break
            
            case "Leave" :
            queue.append("Leave \(separated[1])")
            break
            
            case "Change" :
            idNickNamePair[separated[1]] = separated[2]
            break
            
            default:
            break
        }
    }
    
    for que in queue {
        let str = que.components(separatedBy: " ")
        if str[0] == "Enter" {
            sol.append("\(idNickNamePair[str[1]]!)님이 들어왔습니다.")
        } else {
            sol.append("\(idNickNamePair[str[1]]!)님이 나갔습니다.")
        }
    }
    
    return sol
}

개선 코드

풀면서, 아쉬웠던 점이 있었는데, 고수의 코드를 슬쩍 보고 개선을 진행

코드가 짧아지긴했는데, 로직의 변경이 없어서 성능의 개선은 없었다.

장점으로는,

  • idNickNamePair의 저장 방식을 깔끔하게 변경한 것,
  • action을 지정함으로 실수를 줄일 수 있고, 구현에 있어서 하드코딩이 줄어든 것.
더보기
import Foundation

func solution(_ record:[String]) -> [String] {
    var idNickNamePair: [String:String] = [:]
    let action = ["Enter":"님이 들어왔습니다.", "Leave":"님이 나갔습니다."]
    
    for info in record {
        let separated = info.components(separatedBy: " ")
        
        if idNickNamePair[separated[1]] == nil {
            idNickNamePair[separated[1]] = ""
        }
        
        if separated[0] == "Leave" {
            continue
        } else {
            idNickNamePair[separated[1]] = separated[2]
        }
    }
    
    return record.filter({!$0.contains("Change")})
                .map {
                    let strArr = $0.components(separatedBy: " ")
                    return idNickNamePair[strArr[1]]! + action[strArr[0]]!
                }
}