ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 프로그래머스 - 오픈채팅방
    프로그래밍/알고리즘 PS 2024. 5. 14. 14:30

    학교에서 진행하는 수업에서 주어진 문제를 풀어보았다.

     

    문제의 난이도는 프로그래머스 기준 레벨 2이다.

    문제 링크

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

    문제 설명

     이번 문제는 카카오톡 채팅방에서 '[닉네임]님이 들어왔습니다.', '[닉네임]님이 나갔습니다.'와 같은 메세지가 나타나는 상황에 대하여 어떤 유저가 들어오고 나갔는지 출력하는 문제이다. 이 때, 사용자가 닉네임을 변경하는 상황을 고려해야 하기 때문에 문제 난이도가 조금 높아졌다.

    문제 분석

     채팅방에서 닉네임을 변경하는 방법은 총 두 가지 방법이 있다.

    1. 채팅방을 나간 후, 새로운 닉네임으로 들어오기
    2. 채팅방에서 닉네임을 변경하기

    닉네임을 변경하게 된 경우, 기존에 채팅방에 출력되어 있던 모든 메세지 또한 변경된 닉네임을 기준으로 변경된다. 예를 들어 'A' 유저가 들어오고 'B' 유저가 나간 후 'B' 유저가 'C'로 닉네임을 변경하여 다시 방에 들어오면 'A님이 들어왔습니다.', 'C님이 나갔습니다.', 'C님이 들어왔습니다.'로 출력된다.

     

    이 때 입력은 문자열 배열로, "Enter uid1234 Muzi"와 같은 형태로 주어진다.

    첫 단어는 'Enter', 'Change', 'Leave' 중에 하나이다. 만약 'Enter'가 첫 글자인 경우 'Enter [유저 아이디] [닉네임]'이 주어지고, 'Change'가 첫글자이면 'Change [유저 아이디] [닉네임]'이 주어진다. 'Leave'가 첫 글자인 경우 'Leave [유저 아이디]'가 주어진다.

     

    해당 문제에서 주어진 입력에 대하여 나타나는 출력은 'A님이 들어왔습니다.' ,'B님이 들어왔습니다'와 같은 문자열의 배열이다. 입력에 대한 최종 출력을 구하는 것이 우리가 해결해야 할 문제이다.

    문제 풀이

     해당 문제를 풀 때, C++로 풀고자 하였으나 문자열을 split(공백을 기준으로 쪼개기)하는 데에 더욱 복잡한 방식을 사용해야 하여 파이썬으로 문제를 풀어보았다.

     

     먼저 name_dict라는 딕셔너리를 선언하고, 이 곳에 변경된 최종 [유저 아이디]에 대한 [닉네임]을 저장한다. for문을 통해 주어진 record에서 "Enter"와 "Change"에 대하여 닉네임을 name_dict에 저장하고, 최종적으로 다시 한 번 record를 순회하며 "Enter"에 대해서는 name_dict에 저장된 닉네임으로 들어왔다고 처리하고, "Leave"에 대해서는 name_dict에 저장된 닉네임으로 "나갔다"라고 처리하면 문제가 해결된다.

     

    1. 먼저 최종적으로 사용되는 [유저 아이디]에 대한 [닉네임]을 저장한다.
    2. [유저 아이디]에 대한 [닉네임]을 이용해 '입장하였습니다', '나갔습니다' 등의 문자열을 생성한다.

     

    전체 코드는 아래와 같다.

    전체 코드

    def solution(record):
        answer = []
        
        name_dict = {}
        
        for r in record:
            splittedR = r.split()
            if splittedR[0] == "Enter":
                name_dict[splittedR[1]] = splittedR[2]
            elif splittedR[0] == "Change":
                name_dict[splittedR[1]] = splittedR[2]
        
        for r in record:
            splittedR = r.split()
            if splittedR[0] == "Enter":
                answer.append(f'{name_dict[splittedR[1]]}님이 들어왔습니다.')
            elif splittedR[0] == "Leave":
                answer.append(f'{name_dict[splittedR[1]]}님이 나갔습니다.')
        
        return answer

    '프로그래밍 > 알고리즘 PS' 카테고리의 다른 글

    [C++] BOJ 15683번 - 감시  (0) 2024.05.23
    [C++] BOJ 1992번 - 쿼드트리  (1) 2024.05.14
    [C++] BOJ 5430번: AC  (1) 2024.04.19
    [C++] Programmers: 의상  (0) 2024.04.18
    [C++] BOJ 1932번: 정수 삼각형  (0) 2024.04.18
Designed by Tistory.