[5/28] 오픈채팅방

문제

내 코드

def solution(record):
	#배열 띄어쓰기 단위로 분리
    arr = [record[i].split(" ") for i in range(len(record))]
    
    answer = []
    for j in range(len(arr)):
        if (arr[j][0] == "Enter"):
            answer.append([arr[j][1],"님이 들어왔습니다."])
        elif (arr[j][0] == "Leave"):
            answer.append([arr[j][1],"님이 나갔습니다."])
    
    #바뀐 최신 닉네임을 저장하기 위해, 배열을 마지막부터 돌려서 처음 나오는 아이디와 닉네임만 저장함
    id_list = {}
    for k in range(len(arr)-1, -1, -1):
        if (len(arr[k]) == 3):
            if (arr[k][1] not in id_list):
                id_list[arr[k][1]] = arr[k][2]
    
    #똑같은 아이디들을 최신 닉네임으로 변경함
    for m in range(len(answer)):
        if answer[m][0] in id_list:
            answer[m][0] = id_list[answer[m][0]]
        answer[m] = "".join(answer[m])
    
    return answer

풀이

  1. list comprehension을 사용하여 record를 띄어쓰기 단위로 분리한다.
  2. 안내문 출력을 위해, 아이디와 안내문구를 2차원 리스트로 추가한다.
    (change는 필요 없으므로 if-elif 문을 사용하여 걸러냈다.)
  3. 닉네임 변경을 반영하기 위해, for문을 거꾸로 돌리고, 첫(가장 최신) 아이디와 닉네임만 딕셔너리에 추가한다. (리스트로 만들어도 상관없는데 뭐가 더 효율적인지는 모르겠다)
    (leave에는 닉네임 정보가 없으니 문자열 길이를 사용하여 걸러냈다)
  4. answer와 id_list를 비교하여, 아이디가 같으면 닉네임으로 변경하고, join을 사용하여 합쳐준다.

효율적인 코드

def solution(record):
    answer = []
    namespace = {}
    printer = {'Enter':'님이 들어왔습니다.', 'Leave':'님이 나갔습니다.'}
    
    arr = [record[i].split(" ") for i in range(len(record))]
    
    for r in arr:
      if r[0] in ['Enter', 'Change']:
          namespace[r[1]] = r[2]

    for r in arr:
      if r[0] != 'Change':
          answer.append(namespace[r[1]] + printer[r[0]])

    return answer

피드백

  • 안내 메시지를 for을 사용하여 따로 저장했는데, 여기서는 dictionary를 만들어서 간소화했다.

배운 것

  • 딕셔너리는 중복을 허용하지 않고, 똑같은 키가 들어오면 값을 최신 값으로 바꿔준다.

좋은 웹페이지 즐겨찾기