ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오 기출_프로그래머스_오픈채팅방
    알고리즘/알고리즘 문제풀이 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]]!
                    }
    }
Designed by Tistory.