본문 바로가기
Xcode/Swift - Algorithm

Swift ) 프로그래머스(Lv2) - 오픈 채팅방 (Hash)

by 후르륵짭짭 2020. 9. 8.
728x90
반응형

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

 

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

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

programmers.co.kr

 

안녕하세요 후르륵짭짭 입니다.

이번에돋 카카오 문제를 가져왔습니다.

그런데 카카오 문제치고는 쉽게 나온 것 같습니다.

단순하게 Hash를 사용 할 줄 아느냐를 물어보는 문제 였습니다.

 

** 저의 풀이 **

//0:23
func solution(_ record:[String]) -> [String] {
    
    var dict : [String : String] = [:]
    var stack : [(id : String , commend : String)] = []
    
    for element in record {
        
        let list = element.components(separatedBy: " ")
//        print(list)
        let commend = list[0]
        let userid = list[1]
        
        if commend == "Enter" || commend == "Leave"{
            stack.append((userid, commend))
            
            if commend == "Enter"{
            let name = list[2]
            
            if let _ = dict[userid] {
                dict[userid] = name
            }
            else{
                dict[userid] = name
            }
            }
            
        }
        else if commend == "Change" {
            let name = list[2]
            dict[userid] = name
        }
        
    }
    
    var answer : [String] = []
    
    for element in stack {
        
        let name = dict[element.id]!
        let commend = element.commend
        
        if commend == "Enter"{
//            let input = "\(name)님이 들어왔습니다."
            answer.append("\(name)님이 들어왔습니다.")
        }
        else if commend == "Leave"{
            answer.append("\(name)님이 나갔습니다.")
        }
        
    }
    
    
    return answer
}

 

문제는 Hash에 값이 존재하냐? 존재하지 않냐가 중요한 것 같습니다.

이 문제를 보면 Enter와 Change 일 때만 입력이 세개 이고

Leave라면 입력이 두개 입니다.

그래서 그것에 대한 조건을 나눠줬습니다.

그리고 Dictionary로 중복 여부를 판단 했습니다.

for element in record {
        
        let list = element.components(separatedBy: " ")
//        print(list)
        let commend = list[0]
        let userid = list[1]
        
        if commend == "Enter" || commend == "Leave"{
            stack.append((userid, commend))
            
            if commend == "Enter"{
            let name = list[2]
            
            if let _ = dict[userid] {
                dict[userid] = name
            }
            else{
                dict[userid] = name
            }
            }
            
        }
        else if commend == "Change" {
            let name = list[2]
            dict[userid] = name
        }
        
    }

 

그리고 마지막에 스택에 UserId와 명령을 저장하고 

후에 Dictionary에서 이름을 가져오면 됩니다~!!

  var answer : [String] = []
    
    for element in stack {
        
        let name = dict[element.id]!
        let commend = element.commend
        
        if commend == "Enter"{
//            let input = "\(name)님이 들어왔습니다."
            answer.append("\(name)님이 들어왔습니다.")
        }
        else if commend == "Leave"{
            answer.append("\(name)님이 나갔습니다.")
        }
        
    }
728x90
반응형

댓글