알고리즘

[프로그래머스 Lv2 - 2019 KAKAO BLIND RECRUITMENT] 오픈채팅방 (Python)

lwkejpf 2022. 7. 2. 00:48

 


 

def solution(record):
    li = dict()    
    answer = []
    sen = []
    
    for i, rec in enumerate(record) :
        rec = rec.split()
        op = rec[0]
        id = rec[1]

        if op == "Enter" :
            name = rec[2]
            if id in li.keys() :
                if li[id] != name :
                    idx = [i for i, x in enumerate(sen) if x[0] == id]
                    for i in idx :
                        sen[i][1] = name
            li[id] = name
            sen.append([id, name, 1])

        elif op == 'Leave' :
            name = li[id]
            sen.append([id, name, 2])
            
        else :
            name = rec[2]
            idx = [i for i, x in enumerate(sen) if x[0] == id]
            for i in idx :
                sen[i][1] = name
            li[id] = name
            
    for s in sen :
        str = ''
        if s[2] == 1 :
            str += (s[1] + '님이 들어왔습니다.')
            answer.append(str)
        elif s[2] == 2 :
            str += (s[1] + '님이 나갔습니다.')
            answer.append(str)
    return answer

 

이런 식으로 풀었다가

 

 

 

 

시간 초과남,, 그래서 아예 엎고 생각 다시 했다

 

해결하고 나서 코드 다시 보니까 시간 초과 오류날만 하네 ..

저대로면 유저 이름 바꿔줘야 할 때 그 전에 있던 모든 유저 한 번씩 검사해야 되니께 ,,^

 

 


 

def solution(record):
    li = dict() 
    idx = []
    answer = []
    
    for i, rec in enumerate(record) :
        rec = rec.split()
        op = rec[0]
        id = rec[1]

        if op == "Enter" :
            name = rec[2]
            li[id] = name
            idx.append([1, id])
            
        elif op == 'Leave' :
            idx.append([2, id])
        else :
            name = rec[2]
            li[id] = name
    for i in idx :
        str = ''
        if i[0] == 1 :
            str += (li[i[1]] + '님이 들어왔습니다.')
            answer.append(str)
        else :
            str += (li[i[1]] + '님이 나갔습니다.')
            answer.append(str)
    return answer

 

 

성공 !!

 

단순하게 생각하니까 쉬운 문제였던 것이다 ... 

record 하나씩 가져와서 공백 기준으로 op, id, name 나누고

id 는 유저마다 다 다른 고유한 값이니까

딕셔너리 사용해서 {id : name} 으로 집어넣어줬다

 

그리고 여기서 idx 는 출력하는 순서를 담고 있는 인덱스 리스트인데, 

Enter 랑 Leave 일 때만 출력하면 되니까 임의로 Enter 를 1, Leave 를 2로 뒀다

예를 들어 Enter 이면 [1, id], Leave 이면 [2, id] 형태로 idx 에 append 해줌 !!

 

그리고나서 마지막에 idx 하나씩 돌면서

앞이 1이면 'OO님이 들어왔습니다' 출력해주고

앞이 2이면 'OO님이 나갔습니다' 출력해주면 끝 ~~~