[프로그래머스] 오픈채팅방 python

kiki·2022년 2월 27일
0

프로그래머스

목록 보기
9/76
post-thumbnail

문제 링크

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

문제 설명

카카오톡 오픈채팅방에서 사용자의 출입을 관리자에게 리스트 형식으로 알려주는 것인데, 이름을 바꿔서 다시 들어온 사용자의 경우 전후 모두 바뀐 이름으로 작성해야한다. 또 말로만 설명하면 헷갈리니 사진으로
문제를 알고 들어오셨겠죠잉,,,,? 더 자세하게 필요 없으시죠잉,,,?

1차 시도

def solution(record):
    dic = {}
    answer = []
    for i in range(len(record)-1,-1,-1):
        record[i] = record[i].split()
        if(record[i][1] not in dic.keys()):
            dic[record[i][1]] = record[i][2]
    for s in record:
        if(s[0] == "Enter"):
            answer.append("{0}님이 들어왔습니다.".format(dic[s[1]]))
        elif(s[0] == "Leave"):
            answer.append("{0}님이 나갔습니다.".format(dic[s[1]]))
    return answer
  • 거의 완벽하게 잘 짰다 생각. 오류나도 간단한 오류겠지. 라고 생각
  • 테스트는 실행되는데 정확성 테스트에서 런타임 에러
  • 런타임 에러가 뭔진 알지만 어떤 이유에서 일어나는지는 제대로 몰라서 검색해보니 인덱스를 벗어나면 일어날 수 있다고 해서 vs code에서 돌려보며 확인해보니
  • 또 문제를 제대로 안읽은 그런 나의 안일한 실수...

2차 시도

def solution(record):
    dic = {}
    answer = []
    for i in range(len(record)-1,-1,-1):
        record[i] = record[i].split()
        if(record[i][1] not in dic.keys() and record[i][0]!="Leave"):
            dic[record[i][1]] = record[i][2]
    for s in record:
        if(s[0] == "Enter"):
            answer.append("{0}님이 들어왔습니다.".format(dic[s[1]]))
        elif(s[0] == "Leave"):
            answer.append("{0}님이 나갔습니다.".format(dic[s[1]]))
    return answer

문제는 Leave시 user name이 같이 주어지지 않는데 record[i][2]에 접근해서 인덱스 에러가 난 것이었다.

  • 지금 보니까 테스트에서는 Leave 한 유저가 다시 들어왔기 때문에 저 if문을 들어가지 않아 문제가 생기지 않았던 것. 아주 절묘하네

+) 첫번째 for문을 거꾸로 돈거는 그러면 재입장이나, 이름 변경시 계속해서 dic을 변경할 필요가 없으니까 조금 더 효율적이지 않을까 싶었는데,,, 뭐 그냥 해도 크게 차이 없더라. 왤까. 왠지 아시는분 댓글 좀 달아주시면 아주 굽신굽신

최대 : (146.50ms, 67.1MB)

정리

  • split 함수는 인자로 나누는 기준과 최대 몇번 split 할지를 인자로 받는다.
  • split 함수는 쪼개진 문자열 리스트를 반환한다. ex) ["Enter","uid1234","Muzi"]
  • format 함수는 문자열 내 {idx}를 idx에 맞는 인자로 치환해준다.
  • 런타임 에러는 인덱스를 벗어날시 발생할 수 있다.
  • 다른 사람의 풀이를 돌려보니 기존 배열을 split 한 걸로 바꾸지 않고 그냥 두 번의 for문에서 모두 split 해서 임의의 변수에 저장해 사용하는게 더 시간이 짧다...? 뭘까...? 이차원 배열 인덱스 접근이 오래 걸리나?

0개의 댓글