Algorithm/프로그래머스

[세무민의 코딩일기] 프로그래머스 오픈채팅방 문제 풀기

세기루민 2021. 8. 4. 22:27
728x90

오늘 포스팅 할 내용은 2019 KAKAO BLIND RECRUITMENT에서 나온 문제인 오픈채팅방 문제를 풀어봤습니다.


1. 문제 설명


2. 제한 사항 및 입출력 예시


3. 문제 풀이

이번 문제는 생각보다 당황스러웠던 문제 중 하나였습니다.

제가 푼 방법은 딕셔너리를 이용해서 key와 value를 사용한 방식입니다.

이번 문제는 말 그대로 "Enter Uid1234 Muzi"일 경우 "check usrId name"으로 구분하여 check 값이 요청할 때

해당 usrId에 대한 name값을 반환해주면 되는 문제 입니다.

처음 풀었을 때는 런타임 에러가 발생했었는데 두번째 푼 코드는 런타임 에러가 나지 않고 성공했습니다.

우선 코드를 보면서 하나씩 설명하겠습니다.

# 틀렸던 코드
def solution(record):
   
    resultUsrId = {} 
    resultNumber = {}

    
    for i in range(len(record)):
        checkList = record[i].split(sep=" ")[0]
        checkListU = record[i].split(sep=" ")[1]


        if (record[i].split(sep=" ")[0] == "Enter"):
            resultNumber[i] = "Enter " + record[i].split(sep=" ")[1]
            resultUsrId[record[i].split(sep=" ")[1]] = record[i].split(sep=" ")[2]
            
        elif(record[i].split(sep=" ")[0] == "Leave"):
            resultNumber[i] = "Leave " + record[i].split(sep=" ")[1]
           # resultUsrId[record[i].split(sep=" ")[1]] = record[i].split(sep=" ")[2]
             
        elif(record[i].split(sep=" ")[0] == "Change"):
            resultUsrId.update
            resultUsrId[record[i].split(sep=" ")[1]] = record[i].split(sep=" ")[2]
    


    usrCount = ""
    checkCount = ""
    
    answer = list()
    for i in range(len(resultNumber)):
        checkCount = resultNumber[i].split(sep=" ")[0]
        usrCount = resultNumber[i].split(sep=" ")[1]
        resultCheck = ""

        if(checkCount == "Enter"):
            resultCheck = resultUsrId[usrCount] + "님이 들어왔습니다."
        else:
            resultCheck = resultUsrId[usrCount] + "님이 나갔습니다."

        answer.append(resultCheck)
        
        
        
        
    return answer

위에 코드를 실행하면 result값하고 동일하게 나옵니다. 

그렇기 떄문에 저도 처음에 이게 왜 틀릴까 생각도 많이해보고 고민을 했었습니다. 

그렇지만 곰곰히 생각해보니 굳이 입력받은 리스트의 길이로 반복문을 돌리는 방법 때문에 split을 " "로 조건을 걸어서 

제한 사항을 생각하지 못했습니다. 

def solution(record):
   
    resultList = []
    resultUsrId = {} 

    for i in record:
        temp = i.split()
        check = temp[0]
        usrId = temp[1]
        
        
        if check == "Enter":
            resultUsrId[usrId] = temp[2]
            resultList.append((check, usrId))
        if check == "Change":
            resultUsrId[usrId] = temp[2]
        if check == "Leave":
            resultList.append((check, usrId))
        
        
    
    usrCount = ""
    checkCount = ""
    
    answer = list()
    for i in range(len(resultList)):
        checkCount = resultList[i][0]
        usrCount = resultList[i][1]
        resultCheck = ""

        if(checkCount == "Enter"):
            resultCheck = resultUsrId[usrCount] + "님이 들어왔습니다."
        else:
            resultCheck = resultUsrId[usrCount] + "님이 나갔습니다."
        
        answer.append(resultCheck)
        
        
        
        
    return answer

다시 풀었던 코드입니다. 

위에서는 하나씩 split을 했던 방식을 최소화하였고 이에 따라서 좀 더 간결해졌습니다. 

시간복잡도의 경우에는 2중 포문에 비해 포문을 2번을 나눠 사용하는 것이 좀 더 효율적입니다. 

요약하면 위에서 사용한 코드와 실패했던 코드와 동일한 방법을 이용했습니다. 

둘다 resultList에는 해당 Enter/Leave/Change와 UsrId를 담고 resultUsrId에는 해당 usrId와 Name을 key, Value로 

해당 resultList에서 요구하는 usrId에 대한 name을 resultUsrId에서 받아오는 방식을 이용했습니다.


4. 결과 


이번 포스팅에서도 알고리즘 관련하여 문제를 풀어봤습니다.

다음 포스팅도 더 유익한 정보로 찾아오겠습니다.

 

728x90