Kotlin/Algorithm Problems

<프로그래머스> 오픈채팅방(Lv.2)

re트 2023. 12. 18. 10:55
728x90

[깃허브]

https://github.com/heesoo-park/ForCodeKata/tree/main/%EC%98%A4%ED%94%88%EC%B1%84%ED%8C%85%EB%B0%A9

[프로그래머스]

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

 

주말을 잘 보내고 월요일 첫 문제는 또 카카오에서 만든 문제였다.

쉽지 않겠다 생각하고 들어갔지만 생각보다는... 정말 생각보다는 금방 해결했다.

이 문제는 한 사이클을 완성하는데 시간이 걸렸지, 최적화해가는 과정은 쉽게 쉽게 했다.

 

카카오 문제답게 제일 처음에는 문자열 처리가 있었다.

저번에 풀었던 튜플 문제보다는 처리가 쉬웠다.

공백 기준으로만 나누면 됐기 때문이다.

 

그리고는 저장해놓은 리스트를 돌면서 원하는 조건에 맞춰 돌게했다.

처음에는 알고리즘의 흐름을 입력 하나 들어오면 StringBuilder로 저장하고 닉네임이 변경되면 반복문 돌면서 다 바꾸는 식으로 짰다.

그랬는데 여기서 가장 문제였던 거는 출력 문자열 속의 닉네임과 내가 따로 저장해놓은 유저 아이디와의 관계가 없다는 거였다.

그래서 닉네임이 다른 두 사용자가 있을 때, 한 쪽이 같은 닉네임으로 바꾸고 다른 사용자가 닉네임을 변경할 때 모든 게 바뀌어버린다...

그래서 예제도 통과 못하고 다른 방법을 찾기 시작했다.

 

찾아낸 다른 방법은 따로 유저 아이디와 닉네임을 따로 저장해두고 마지막에 유저 닉네임을 메세지에 넣는 거다.

그래서 정보를 저장해두기 위한 리스트를 2개 만들었고 값이 존재한다면 닉네임의 값만 바꾸는 식으로 했다.

또한 MessageFormat이라는 데이터 클래스도 만들어서 유저 아이디와 출입 정보 메세지를 묶어놨다.

그렇게 제출을 자신만만하게 했는데... 시간초과가 나버렸다.

여기서 약간 멘붕이 올 뻔 했는데 다행히 방법이 바로 생각이 났다.

 

시간초과가 난 이유가 유저 정보를 저장하는 List 때문이라고 생각이 들었다.

통과한 방법은 바로 Map이었다.

어떻게 보면 유저 아이디가 key, 닉네임을 value라고 볼 수 있고 값 변경이 많이 일어날 때 상수 시간 안에 가능하기 때문에 아주 좋은 선택지였다.

키가 존재하면 값을 변경해주고 키가 없으면 키값쌍을 추가해주니 완벽..!!

그렇게 변경을 하고 나니  코드가 엄청 간단해지고 제출 결과도 통과였다.

약간 기억 저편에 있던 Map을 다시 꺼내와서 쓸 수 있는 기회가 와서 좋았다.

 

해당 방법으로 작성한 코드는 다음과 같다.

class Solution {
    fun solution(record: Array<String>): Array<String> {
        var answer = arrayOf<String>()
        val userData = mutableMapOf<String, String>()
        val messages = mutableListOf<MessageFormat>()
        val splitRecord = record.map { it.split(" ") }

        splitRecord.forEach { it ->
            when (it[0]) {
                "Enter" -> {
                    userData[it[1]] = it[2]
                    messages.add(MessageFormat(it[1], "님이 들어왔습니다."))
                }
                "Leave" -> {
                    messages.add(MessageFormat(it[1], "님이 나갔습니다."))
                }
                "Change" -> {
                    userData[it[1]] = it[2]
                }
            }
        }

        messages.forEach {
            answer += (userData[it.uid] + it.format)
        }
        
        return answer
    }

    data class MessageFormat(var uid: String, var format: String)
}
반응형