Swift랑 친해지기/programmers 풀기

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

데브킹덕 2022. 11. 12. 16:27

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

변수 선언

  • situation = "Enter", "Leave", "Change"를 받는 상황을 나타내는 문자열 배열
  • userID = 유저 아이디를 받을 문자열 배열
  • nickName = "Prodo", "Muzi" 같은 닉네임을 담을 문자열 배열
  • dic = key값에 userID, value값에 nickName을 담을 문자열 딕셔너리
  • element = record의 각 요소들을 한 단어 나누어 추가하는 문자열 배열
  • ex)"Enter uid1234 Muzi" -> ["E","n","t","e","r"," ","u","i","d","1","2","3","4"," ","M","u","z","i"]
  • str = element 각 요소들을 접근하여 차례로 추가하는 문자열
  • space = element의 공백의 갯수
  • id = dic 에  key값에 담을 문자열
  • result = 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 다음 배열

 

 

풀이방법)

1. record 문자열 배열의 요소들을 차례로 한 문자씩 담을 수 있도록 .map 고차함수를 이용하여 매핑해줌

  • element = record의 각 요소들을 한 단어 나누어 추가하는 문자열 배열

2. element 문자열 배열의 요소들 중 " " 공백을 기준으로 조건문을 만듦

- " "공백인것 중에 space가 0(첫 공백)이라면

str은 "Enter", "Leave", "Change" 중에 한 가지를 담고 있으므로 

situation 배열에 .append를 이용해 str 추가

추가후 str 을 다시 사용해야 하므로 빈문자열 ""로 초기화

space에 1추가 해줌

 

- " "공백인것 중에 나머지 (두 번째 공백)이라면

str은 "uid1234" 와 같이 id를 담고 있는 문자열임

id에 str을 추가함 - 추후에 딕셔너리에서 key 값에 사용해야 하므로

str 을 다시 사용해야 하므로 빈문자열 ""로 초기화

space 1추가 해줌

 

- " "공백이 아니라면

str에 element의 요소를 추가해줌

- 만약에 j가 마지막 요소 즉(j = element.count -1)이고

    - 마지막 요소 중에 space 가 2인 (입장하거나 이름을 변경) 경우라면

        str이 "Prodo","Muzi"와 같은 닉네임으로  nickName 배열에 추가해줌

        이때 dic 딕셔너리의 key값과 value값을 초기화 할 수 있으므로 dic[id]에 str을 넣어줌

        * 딕셔너리 사용한 이유는 입장하거나 이름 변경시을 아무리해도 마지막 id이름(key값)으로 nickName(value)을 찾아서 변경해 문           자열로 바꾸기 위함임

        다음 새로운 element 배열의 요소에 접근을 하므로 str을 빈문자열로 초기화

 

    -마지막 요소 중에 space가 1일 경우

       "Leave"의 경우이고 str이  "uid1234"와 같은 유저 아이디이므로 userID에 추가

 

 

 

이렇게 되면 situation과 userID의 개수는 동일해짐

nickName의 개수는 situation의 개수 - Leave의 개수임

 

situation의 요소에 접근해 "Enter", "Leave"라면

dic 딕셔너리의 key값에 맞는 value를 찾아 문자열에 추가해 result에 append 메서드로 추가후 반환

key -> userID[i]

 

import Foundation

func solution(_ record:[String]) -> [String] {
    
    var situation = [String]()
    var userID = [String]()
    var nickName = [String]()
    var dic: [String : String] = [:]
    
    for i in 0..<record.count{
        let element = record[i].map{String($0)} 
        var str = ""
        var space = 0
        var id = ""

        for j in 0..<element.count{
            if element[j] == " "{
                if space == 0{
                    situation.append(str)
                    str = ""
                    space += 1
                }
                else{
                    userID.append(str)
                    id = str
                    str = ""
                    space += 1
                }
            }
            else{
                str += element[j]
                if j == element.count - 1{
                    if space == 2{
                        nickName.append(str)
                        dic[id] = str
                        str = ""
                    }
                    else{
                        userID.append(str)
                    }
                }
            }
        }
    }
    
    var result = [String]()
    for i in 0..<situation.count{
        if situation[i] == "Enter"{
            result.append(dic[userID[i]]! + "님이 들어왔습니다.")
        }
        if situation[i] == "Leave"{
            result.append(dic[userID[i]]! + "님이 나갔습니다.")
        }
    }

    return result
}