문제

https://www.welcomekakao.com/learn/courses/30/lessons/42888?language=python3

풀이

#input
["Enter uid1234 Muzi",
"Enter uid4567 Prodo",
"Leave uid1234",
"Enter uid1234 Prodo",
"Change uid4567 Ryan"]

#result
["Prodo님이 들어왔습니다.",
"Ryan님이 들어왔습니다.",
"Prodo님이 나갔습니다.",
"Prodo님이 들어왔습니다."]

문자열 배열을 이용하는 문제들은 대부분 효율성 검사를 빡세게 잡기 때문에 긴장했는데,
문자열 배열 길이가 최대 100,000 이라는거 보고 효율성보다는 구현 자체를 보는 문제구나 싶어서
마음 비우고 가볍게 풀어낸 문제.

기능이 Enter / Leave / Change 3가지 뿐이므로
가장 첫글자만 따서 비교하면 조금이나마 빠르게 진행이 가능하다.

def solution(record):
    table = {}              # 유저별 닉네임을 담기 위한 해시테이블
    for re in record :      # 닉네임 변경기록 탐색
        if re[0] == 'E' or re[0] == 'C':
            u = re.split()
            table[u[1]] = u[2]

    result = []
    for re in record :      # Enter / Leave에 반영
        if re[0] == 'E' :
            u = re.split()
            result.append(table[u[1]] + "님이 들어왔습니다.")

        elif re[0] == 'L':
            u = re.split()
            result.append(table[u[1]] + "님이 나갔습니다.")

    return result

E 또는 C 일 경우 해시테이블에 닉네임을 반영시켜서 최신 닉네임을 기록한다.
이후 다시 기록을 처음부터 훑으면서 E 또는 L 일 경우 출력한다.

더 나은 풀이

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

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

    return answer

알고리즘은 동일하지만, 두 번째 for문을 좀 더 섹시하게 풀어낸 코드.

댓글남기기