ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문자열 처리 - 오픈채팅방
    Algorithm 2021. 5. 3. 14:28

    아래 문제는 프로그래머스에서 제공하는 코딩테스트 > 오픈채팅방의 문제입니다🧑🏻‍💻

     

    문제 제시

    지문이 길어 링크로 대신☺️
    programmers.co.kr/learn/courses/30/lessons/42888

     

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

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

    programmers.co.kr

    문제 해결

    import Foundation
    var nickName: [String : String] = [:]
    var input: [(id: String, commend: String)] = []
    
    func solution(_ record:[String]) -> [String] {
        for i in 0 ..< record.count {
            let recordSplit = record[i].components(separatedBy: " ")
            let commend = recordSplit[0]
            let uid = recordSplit[1]
            
            switch commend {
            case "Enter":
                nickName.updateValue(recordSplit[2], forKey: uid)
                input.append((uid, commend))
            case "Leave":
                input.append((uid, commend))
            default:
                compareName(name: recordSplit[2], uid: uid)
            }
        }
        return result()
    }
    
    func compareName(name: String, uid: String) {
        nickName.updateValue(name, forKey: uid)
    }
    
    func result() -> [String] {
        var result: [String] = []
        
        for i in 0 ..< input.count {
            let index = input[i]
            
            switch index.commend {
            case "Enter":
                result.append("\(nickName[index.id]!)님이 들어왔습니다.")
            case "Leave":
                result.append("\(nickName[index.id]!)님이 나갔습니다.")
            default:
                break
            }
        }
        return result
    }

    사용된 개념

     - 딕셔너리

     - 2차원 배열

     - 문자열

     - 스택

     문제 뒷담화

    해당 문제는 지문이 너무 길어 당황을 했지만, 막상 풀면서 그렇게 복잡한 문제는 아니라고 생각이 들었다.

    우선 중요한 핵심은 딕셔너리와 2차원 배열을 생성하여 닉네임이 변경될 시 업데이트를 구현해줘야한다.

    우선 커맨드는 3가지로 입장,퇴장,변경으로 나눌 수 있다.

    주어진 인자를 제일먼저 스페이스(공백)로 구분지어 나눠봐야한다. 나눌때는 components와 split으로 문자열을 쉽게 나눌 수 있는데,

    둘의 차이는 split은 표준 라이브러리에 속해 Foundation을 임포트 하지 않아도 사용이 되며 [SubString] 형태로 반환을 합니다. 그렇지만 더 다양한 옵션 인자값을 줄 수 있습니다. 그에 비해 components는 [String] 형태로만 반환하며 Foundation 프레임워크에 들어있어 임포트를 해야합니다. 또한, 옵션 인자값이 없고 줄 수 있는 옵션이 separatedBy 하나입니다.

    여기서는 단순 문자열만 나눠주는것으로 split보다는 components를 택했습니다. 또한 split으로 나눠주게 되면 추후 사용할때 String 타입으로 변환해줘야하는 번거로움이 있습니다.

    나눈 뒤 각 커맨드, uid의 값을 변수로 할당하고 커맨드에 따라 조건문을 돌려줍니다.

    입장시, 닉네임/uid로 이뤄진 딕셔너리에 값을 저장하도록 구현해주고 input 2차원 배열에 uid와 커맨드를 스택처럼 쌓습니다.

    퇴장시, 스택에 위와 같이 쌓습니다.

    변경시, 함수를 따로 분리시켜 닉네임 딕셔너리의 uid를 키값으로 이름을 업데이트 하도록 해줍니다.

    마지막으로 결과 함수를 분리시켜 반복문을 돌며 결과값 배열에 문자열을 저장해주고 반환해줍니다.

    메서드를 분리하여 나눴지만 메서드를 통합시켜 하는 방법도 괜찮을거라 생각이 들었습니다.

     

    [참고자료]

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

     

    'Algorithm' 카테고리의 다른 글

    정렬 - 가장 큰 수  (0) 2021.05.04
    탐욕법 > 체육복  (0) 2021.05.04
    완전탐색 - 모의고사  (0) 2021.05.04
    정렬 - k번째수  (0) 2021.05.04
    해시 - 위장  (0) 2021.04.21
Designed by Tistory.