본문 바로가기
알고리즘

[Swift 알고리즘] 프로그래머스 lv2 - 오픈채팅방

by 코코종 2022. 3. 14.
728x90

안녕하세요 코코종입니다! 다시 알고리즘 스터디를 시작했답니다! (신입도 경력도 피할 수 없서...)

뼈 때리지마여..

프로그래머스 오픈채팅방

 

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

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

programmers.co.kr

문제에 대한 설명은 링크에서 참조하도록 하고 일단 제가 푼 코드를 보시죠!

import Foundation

enum Commands: String{
    case Enter
    case Leave
    case Change
}

func solution(_ record:[String]) -> [String] {
    
    var dict: [String : String] = [:]
    var result: [String] = []
    
    for rec in record {
        var splited = rec.components(separatedBy: " ")
        // print(splited) // command, uid, name
        var command = splited[0]
        var uid = splited[1]
        var name = ""
        if splited.count>2 {
            name = splited[2]
        } else {
            name = dict["\(uid)"]!
        }
        
        switch command {
            case Commands.Enter.rawValue:
                result.append("\(uid)님이 들어왔습니다.")
                dict[uid] = name
            case Commands.Leave.rawValue:
                result.append("\(uid)님이 나갔습니다.")
            case Commands.Change.rawValue:
                dict[uid] = name
            default:
                print("error")        
        }
        
//         print(result)
    }
    
    var newResult: [String] = []
    result.forEach {
        var before = $0.components(separatedBy: "님") // uid, ~~습니다.
        newResult.append("\(dict[before[0]]!)님\(before[1])")
    }
        
    return newResult
}

 


간단하게 설명은 하자면

[uid : name]을 dictionary 형태로 만들고 name이 변경된다면 dictionary 업데이트 해주는 겁니다. 처음에 들어온 채팅 로그를 result에 uid를 기준으로 구성해줍니다. 모든 변경 사항을 확인 한 후 로그의 내용을 dictionary의 uid에 맞게 name으로 바꿔 주면 끝!!

어때요 참 쉽죠? (사실 어려웠습니다...)

 

그런데 제출을 하고나서 생각해보니 result와 newResult로 2번이나 메모리를 차지하게 되어서 좀 비효율적이라고 생각했는데요(물론 머리로 날아가는 비둘기도 기능 구현은 성공한거지만...^^) 그래서 뇌내 코딩으로는 dictionary의 작업만 먼저 해주고 추후에 for문을 돌며 채팅 로그를 찍어도 되겠다고 생각을 했는데요. 다른 스터디원분들은 그렇게 푸셨더라구여 ㅎㅎ 생각이라도 한거에 만족합니다!

 

아쉬운 점은

앞서 말한 점과 굳이 열거형을 사용해서 코드가 더 길어진 것과 components 보다 split이 더 빠르다고 하는데 substring을 잘 다룰 줄 몰라서 일단 components를 사용한 점 입니다. 또한 for문을 고차함수를 활용해서 사용하는 법을 조금 더 익히면 좋겠다고 생각합니다.(그래도  마지막에는 forEach를 썼네요 ㅎㅎ)

 

앞으로도 1일 1알고리즘을 할 예정이므로 열심히 써보겠습니다! swift로 된 자료가 많이 없더라구요!(왜 인지는 알 것 같지만서도..ㅎㅎ...)

그럼 저는 내일 또 문제풀이로 돌아오겠습니다~

728x90